android HttpURLConnection

阅读数:22 评论数:0

跳转到新版页面

分类

python/Java

正文

在android 6.0(api 23)sdk之后,HttpClient不再提供,所以android原生的网络请求为HttpURLConnection,它是JDK自带的请求工具。

一、介绍

1、HttpClient与HttpURLConnection的比较

(1)HttpClient是apache的开源框架,封装了访问http的请求头、参数、内容体、响应等待,使用起来比较方便,而HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便,比如重访问的自定义,以及一些高级功能等等。

(2)从稳定性方面来说的话,HttpClient很稳定、功能强,Bug少,容易控制细节,而之前的HttpURLConnection一直存在着版本兼容问题,不过在后续的版本中已经相继修复掉了。

2、android中为什么要废除HttpClient呢?

(1)HttpUrlConnection是SDK的标准实现,而HttpClient是apache的开源实现。

(2)HttpUrlConnection直接支持GZIP压缩,HttpClient也支持,但要自己写代码处理。

(3)HttpUrlConnection直接支持系统级连接池,即打开的连接不会直接关闭,在一段时间内所有程序可共用,HttpClient当然也能做到,但毕竟不如官方直接系统底层支持好。

(4)HttpUrlConnection直接在系统方面做了缓存策略处理,加快重复请求的速度 。

3、它在URLConnection的基础上提供了如下便捷的方法:

// 获取服务器的响应代码
int getResponseCode();
// 获取服务器的响应消息
String getResponseMessage();
// 获取发送请求的方法
String getResponseMethod();
// 设置发送请求的方法
void setRequestMethod(String method);

4、connect()方法需不需要调用?

其实不需要显示的调用connect方法,只需要调用getResponseCode()即可。

 

二、使用

通用部分

String url = "https://www.baidu.com/";
URL url = new URL(url);
//得到connection对象。
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//设置请求方式
//...
/得到响应码
int responseCode = connection.getResponseCode();
if(responseCode == HttpURLConnection.HTTP_OK){
  //得到响应流
  InputStream inputStream = connection.getInputStream();
  //...
}

1、GET请求实现

connection.setRequestMethod("GET");
// 如果需要传递参数,直接把参数拼接到url后面

2、POST请求实现

connection.setRequestMethod("POST");
connection.setDoOutput(true); // 允许写
connection.setDoInput(true); // 允许读
connection.setUseCaches(false); // 不使用缓存

// 如果使用键值对传递参数
String body = "username=xx&password=xx";
BufferWriter writer = new BufferWriter(new OutputStreamWriter(connection.getOutputStream,"UTF-8"));
writer.write(body);
writer.close();

// json格式数据
connection.setRequestProperty("Content-Type","application/json;charset=utf-8");
String body = "{username:xx,password: xx}"; // 也可以使用json工具生成

// 设置请求头
connection.setRequestProperty("xx",xx);

3、文件上传

connection.setRequestProperty("Content-Type","file/*");
// 把文件封装成一个流
OutputStream outputStream = connection.getOutputStream();
FileInputStream fileInputStream = new FileInputStream("filepath");
int length = -1;
byte[] bytes = new bytes[1024];
while((length=fileInputStream.read(bytes)!=-1){
 outputStream.write(bytes,0,length);
}
fileInputStream.close();
outputStream.close();

4、android权限

  <uses-permission android:name="android.permission.INTERNET"/>