转载请标明出处:
http://blog.csdn.net/mr_lawen/article/details/53334006
简介
OkHttp是一款高效的HTTP请求框架,支持连接同一地址的链接共享同一个socket,通过连接池来减小响应延迟,还具有有透明的GZIP压缩,请求缓存等优势。
配置依赖
compile 'com.squareup.okhttp:okhttp:2.4.0'
OkHttp内部依赖okio,需要同时导入okio:
compile 'com.squareup.okio:okio:1.5.0'
添加权限
<uses-permission android:name="android.permission.INTERNET"/>
使用方式
Http Get
创建出OkHttpClient对象
OkHttpClient mOkHttpClient = new OkHttpClient();
创建一个http请求,这里为get请求方式
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
通过OkHttpClient将request请求封装为一个任务call
Call call = mOkHttpClient.newCall(request);
将call加入任务队列,并添加回调
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException {
//请求成功,获得返回数据
Logger.d(response.body().string());
}
});
以上就是发送一个get请求的步骤:
首先构造一个Request请求对象,请求的参数至少有url,可以通过Request.Builder设置更多的参数(header、method等)。
然后将request封装为一个任务call。
最后异步执行请求,将call加入调度队列,等待任务执行完成,就可以在Callback中得到返回结果。通过response.body().string()可以获取返回的字符串;通过response.body().bytes()可以获取返回的二进制字节数组;通过response.body().byteStream()可以获取返回的InputStream,支持大文件下载。OnResponse()执行的线程不是UI线程,如果想要更新UI还需要通过handler等方式。
Http Post
首先同样是创建OkHttpClient对象
OkHttpClient mOkHttpClient = new OkHttpClient();
然后构建键值对请求体,使用FormEncodingBuilder
RequestBody requestBody = new FormEncodingBuilder()
.add("phoneNumber", "15545104510")
.add("action", "17").build();
但是FormEncodingBuilder不可以更改编码方式,当我们不需要OkHttp默认的utf-8编码时,这种键值对请求方式就不适用了,你可以下载源码进行修改,但这样代价有点大,没必要,有另一种实现方式:
String params = "phoneNumber=15545104510&action=17";
RequestBody requestBody = RequestBody
.create(MediaType.parse("application/x-www-form-urlencoded;charset=gbk"),params);
通过RequestBody.create()方式,修改编码方式,将请求键值对参数以字符串的形式加入。注意这样只是修改了请求时的编码,onResponse()中获取数据时也要进行转码:
Logger.d(new String(response.body().bytes(),"gbk"));
这种方式也同样适合post Json串。
接下来创建一个Request对象
Request request = new Request.Builder()
.url(url)
.post(requestBody) //加入请求体
.build();
通过OkHttpClient将request请求封装为一个任务call
Call call = mOkHttpClient.newCall(request);
将call加入任务队列,并添加回调
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException
{
//请求成功,获得返回数据
Logger.d(new String(response.body().bytes(),"gbk"));
}
});