android HttpURLConnection

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



相关推荐

程序启动图标(Logo)\底部菜单图标 小屏ldpi() 36x36 px 中屏mdpi(160dpi) 48x48 px 大屏hdpi(240dp

一、预备知识 Fragment必须嵌入到Activity中, 当Activity暂停时, 其中的所有片段也会暂停, 当Activity被销毁时,所有片段也会被销毁. 不过,  当Activity正在运

该属性是当一个view获取焦点时, 定义ViewGroup和其子控件两者之间的关系, 属性的值有三种: (1) beforeDescendants: viewgroup会优先其子控

只有在LinearLayout时, 该属性才有效. android:layout_w

gravity的中文意思就是"重心", 就是表示view横向和纵向的依靠位置. a

android webview从Lollipop(5.0)开始webview默认不允许混合模式, https当中不能加载http资源, 而开发的时候可能使用的是https的链接, 但是链接中的图

从网上查找资料,发现有多种方式, 我用了其中最简单的方式: 使用java.lang.String的replace方法, <pre class="language-marku

在Anrdoid自定义View时候,需要使用TypedArray来获取XML layout中的属性值,使用完之后,需要调用recycle()方法将TypeArray回收。 那么Ty

当我们的项目的某些属性和第三方库中属性有冲突或者我们想修改第三方库中某些资源时,我们就需要使用tools:replace来处理。 1、有冲突的情况 比如第三方库中

在Android中,使用Span定义文本的样式,通过Span改变几个文字的颜色,Span能够改变TextPaint属性,在Canvas上绘制,甚至是改变文本的布局和影响行高这样的元素。Span是