大多数连接网络的 Android app 会使用 HTTP 来发送与接收数据。Android 提供了三种 HTTP client:HttpURLConnection、 HttpClient和OkHttpClient。都支持 HTTPS、流媒体上传和下载、可配置的超时、IPv6 与连接池(connection pooling)。
一、Java.net包中的HttpURLConnection类
HttpUrlConnection是JDK里提供的联网API,我们知道Android SDK是基于Java的,所以当然优先考虑HttpUrlConnection这种最原始最基本的API,其实大多数开源的联网框架基本上也是基于JDK的HttpUrlConnection进行的封装罢了
二、HttpClient ,目前Android库已弃用
三、 OkHttpClient
http是现在主流应用使用的网络请求方式, 用来交换数据和内容, 有效的使用HTTP可以使你的APP变的更快和减少流量的使用。
OkHttpClient是一个很棒HTTP客户端:
支持SPDY,可以合并多个到同一个主机的请求
使用连接池技术减少请求的延迟(如果SPDY是可用的话)
使用GZIP压缩减少传输的数据量
缓存响应避免重复的网络请求
当你的网络出现拥挤的时候,就是OKHttp大显身手的时候,它可以避免常见的网络问题,如果你的服务是部署在不同的IP上面的,如果第一个连接失败,OkHTtp会尝试其他的连接。这对现在IPv4+IPv6中常见的把服务冗余部署在不同的数据中心上也是很有必要的。OkHttpClient将使用现在TLS特性(SNI ALPN)来初始化新的连接,如果握手失败,将切换到TLS 1.0。
使用OkHttpClient很容易,同时支持异步阻塞请求和回调.
如果你使用OkHttpClient,你不用重写你的代码, okhttp-urlconnection模块实现了 java.net.HttpURLConnection 中的API, okhttp-apache模块实现了HttpClient中的API
最近很火的Retrofit网络请求框架,内部封装也是OkHttpClient.
顺便说下OkHttpClient. POST请求传递参数的方法总结
1,使用FormBody传递键值对参数
这种方式用来上传String类型的键值对
使用示例如下:
private void postDataWithParame() {
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
formBody.add("username","zhangsan");//传递键值对参数
Request request = new Request.Builder()//创建Request 对象。
.url("http://www.baidu.com")
.post(formBody.build())//传递请求体
.build();
client.newCall(request).enqueue(new Callback() {。。。});//此处省略回调方法。
}
2,使用RequestBody传递Json或File对象
RequestBody是抽象类,故不能直接使用,但是他有静态方法create,使用这个方法可以得到RequestBody对象。
这种方式可以上传Json对象或File对象。
上传json对象使用示例如下:
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
* MediaType JSON = MediaType.parse("application/json; charset=utf-8");//数据类型为json格式,
* String jsonStr = "{\"username\":\"lisi\",\"nickname\":\"李四\"}";//json数据.
* RequestBody body = RequestBody.create(JSON, josnStr);
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {。。。});//此处省略回调方法。
3.上传File对象使用示例如下:
MediaType fileType = MediaType.parse("File/*");//数据类型为json格式,
File file = new File("path");//file对象.
RequestBody body = RequestBody.create(fileType , file );