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); } }); }}
- 因为HttpURLConnection是一个抽象类,所以不能被直接实例化,通过URL.openConnection()方法得
到HttpURLConnection的父类,然后再强转成HttpURLConnection对象实例。 - 无论是post请求还是get请求,connect()函数实际上只是建立了一个与服务器的tcp连接,并没有实际
发送http请求。但是也可以不通过connect()方法来建立连接,因为getOutputStream()方法会隐式的
进行connect。 - 方法的调用顺序非常重要,对connection对象的一切配置(就是各种set方法)必须在connect()方法之
前调用,getOutputStream()方法必须在getInputStream()之前调用。 - 前面说到了各种方法的调用顺序,那么为什么要这样呢。首先HttpURLConnection对象被创建,然后被
指定各种选项(例如连接超时时间,是否使用缓存,是否读取输出流等),然后与服务端建立连接。如
果已经连接成功再设置这些选项将会报错。 - 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: } }}
阅读全文
0 0
- HttpURLConnection
- HttpURLConnection
- HttpURLConnection
- httpurlconnection
- HttpURLConnection
- HttpURLConnection
- HttpURLConnection
- HttpURLConnection
- HttpURLConnection
- HttpURLConnection
- HttpURLConnection
- HttpURLConnection
- HttpURLConnection
- HttpURLconnection
- HttpURLConnection
- HttpURLConnection
- HttpURLConnection
- httpurlconnection
- html发送邮件
- java class 文件格式分析及实例完全标注
- Java学习笔记之IO(十):BufferedWriter缓冲输出字符流
- LeetCode----- 15.3Sum
- 成为一个高效的web开发人员,只需要三步
- HttpURLConnection
- Java多线程之wait(),notify(),notifyAll()
- 欢迎使用CSDN-markdown编辑器
- mybatis 二级缓存
- numpy matrix矩阵操作
- ThreadLocal详解
- Best JS Charting Libs
- kong and postgrep sql
- GiD学习笔记