HttpURLConnection

来源:互联网 发布:淘宝双11 销量冠军 编辑:程序博客网 时间:2024/06/07 08:03

Get方法

public class MainActivity extends AppCompatActivity {    private Button sendRequest;    private TextView responseText;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        sendRequest = (Button) findViewById(R.id.send_request);        sendRequest.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                sendRequestWithHttpURLConnection();            }        });        responseText = (TextView) findViewById(R.id.response_text);    }    private  void sendRequestWithHttpURLConnection(){        new Thread(new Runnable() {            @Override            public void run() {                HttpURLConnection connection = null;                BufferedReader reader = null;                BufferedWriter writer = null;                try{                    URL url = new URL("https://www.baidu.com");                    connection = (HttpURLConnection) url.openConnection();                    //请求方法                    connection.setRequestMethod("GET");                    //连接超时                    connection.setConnectTimeout(8000);                    //读取超时                    connection.setReadTimeout(8000);                    //需要输出                    connection.setDoOutput(true);                    //需要输入                    connection.setDoInput(true);                    //设置字符集                    connection.setRequestProperty("Charset","UTF-8");                    //设置文件类型                    connection.setRequestProperty("Content-Type","text/xml; charset=UTF-8");                    //设置请求参数,可通过Servlet的getHeader()获取 Servlet是服务器                    connection.setRequestProperty("Cookie","AppName="+ URLEncoder.encode("你好","UTF-8"));                    //自定义参数                    connection.setRequestProperty("MyProperty","this is me!");                    //需要缓存                    connection.setUseCaches(true);                    //连接                    //connection.connect();                    //获取URLConnection对象对应的输出字节流,并且封装为字节流                    writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));                    //发送请求参数,自定义参数                    writer.write("xx=xx&&yy=yy");                    writer.flush();                    //本次HTTP请求已结束,下边向对象输出流的输出已无意义                    writer.close();                    //如果响应代码是200表示成功                    if(connection.getResponseCode() == 200){                        //开始获取数据,得到输入流,并且封装为输入字符流                        reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));                        //writer.write("xx=xx&&yy=yy");无意义                        StringBuilder respone = new StringBuilder();                        String line;                        while((line = reader.readLine())!=null){                            //StringBuider存储读取的数据                            respone.append(line);                        }                        reader.close();                        showResponse(respone.toString());                    }                } catch (Exception e){                    e.printStackTrace();                }                 if(connection !=null){                    connection.disconnect();                }            }        }).start();    }    //Android是不允许在子线程中给更新UI操作,所以用runOnUiThread把线程切换到主线程    private void showResponse(final String respone){        runOnUiThread(new Runnable() {            @Override            public void run() {                //进行UI操作,讲结果显示到界面上                responseText.setText(respone);            }        });    }}
  1. 因为HttpURLConnection是一个抽象类,所以不能被直接实例化,通过URL.openConnection()方法得
    到HttpURLConnection的父类,然后再强转成HttpURLConnection对象实例。
  2. 无论是post请求还是get请求,connect()函数实际上只是建立了一个与服务器的tcp连接,并没有实际
    发送http请求。但是也可以不通过connect()方法来建立连接,因为getOutputStream()方法会隐式的
    进行connect。
  3. 方法的调用顺序非常重要,对connection对象的一切配置(就是各种set方法)必须在connect()方法之
    前调用,getOutputStream()方法必须在getInputStream()之前调用。
  4. 前面说到了各种方法的调用顺序,那么为什么要这样呢。首先HttpURLConnection对象被创建,然后被
    指定各种选项(例如连接超时时间,是否使用缓存,是否读取输出流等),然后与服务端建立连接。如
    果已经连接成功再设置这些选项将会报错。
  5. post请求参数是放在正文里面的,正文通过outputStream流写入的,实际上outputStream是个字符串
    流,往里面写入的东西不会立即发送到网络,而是存在于内存缓冲区中,待outputStream流关闭时,
    根据输入的内容生成http正文。在getInputStream()函数调用的时候,就会把准备好的http请求正式
    发送到服务器了,然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。即使
    outputStream流没有关闭,在调用getInputStream()之后再写入参数也无效了。

Post方法

public class MainActivity extends AppCompatActivity{    private TextView responseText;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button request = (Button) findViewById(R.id.send_request);        responseText = (TextView) findViewById(R.id.response_text);        request.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                sendRequestWithHttpURLConnection();            }        });    }    private void sendRequestWithHttpURLConnection(){        new Thread(new Runnable() {            @Override            public void run() {                HttpURLConnection connection = null;                BufferedInputStream bis = null;                BufferedOutputStream bos= null;                try{                    URL url = new URL("https://www.baidu.com");                    connection = (HttpURLConnection) url.openConnection();                    connection.setRequestMethod("POST");                    connection.setConnectTimeout(8000);                    connection.setReadTimeout(8000);                    connection.setDoInput(true);                    connection.setDoOutput(true);                    //Post请求不能设置缓存                    connection.setUseCaches(false);                    connection.setRequestProperty("Content-type", "application/x-java-serialized-object");                    bos = new BufferedOutputStream(connection.getOutputStream());                    bos.write("xx=xx&yy=yy".getBytes());                    bos.flush();                    bos.close();                    bis = new BufferedInputStream(connection.getInputStream());                    //创建一个写入字节流                    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();                    byte[] bytes = new byte[1024];                    int len;                    while((len=bis.read(bytes))!=-1){                        byteStream.write(bytes,0,len);                        byteStream.flush();                    }                    bis.close();                    byteStream.close();                    showResponse(byteStream.toString("utf-8"));                }catch (Exception e){                    e.printStackTrace();                }            }        }).start();    }    private void showResponse(final String respone){        runOnUiThread(new Runnable() {            @Override            public void run() {                responseText.setText(respone);            }        });    }}

OKHttp

在build.gradle中添加compile ‘com.squareup.okhttp3:okhttp:3.4.1’

public class MainActivity extends AppCompatActivity implements View.OnClickListener{    private TextView responseText;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button sendRequest = (Button) findViewById(R.id.send_request);        responseText = (TextView) findViewById(R.id.response_text);        sendRequest.setOnClickListener(this);    }    private void sendRequestWithOkhttp(){        new Thread(new Runnable() {            @Override            public void run() {                try {                    //Request是OkHttp中访问的请求,Builder是辅助类。Response即OkHttp中的响应。                    OkHttpClient client = new OkHttpClient();                    Request request = new Request.Builder()                            .url("https://www.baidu.com")                            .build();                    Response response = client.newCall(request).execute();                    String responseData= response.body().string();                    showResponse(responseData);                } catch (IOException e) {                    e.printStackTrace();                }            }        }).start();    }    private void showResponse(final String response){        runOnUiThread(new Runnable() {            @Override            public void run() {                responseText.setText(response);            }        });    }    @Override    public void onClick(View view) {        switch (view.getId()){            case R.id.send_request:                sendRequestWithOkhttp();                break;            default:        }    }}
原创粉丝点击