android HttpURLConnection
阅读数:142 评论数: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"/>