您的位置:首页 > 理论基础 > 计算机网络

OKHttp使用详解及源码解析

2017-09-09 23:06 686 查看
本文转载自:http://blog.csdn.net/aiynmimi/article/details/51984716

使用

①首先导入依赖,最新的版本是3.4.1,在gradle中:

compile 'com.squareup.okhttp3:okhttp:3.4.1'
1



OKHttp内部依赖Okio库,所以也要添加Okio库,最新版本为1.9.0:

compile 'com.squareup.okio:okio:1.9.0'
1



②发送HTTP请求
GET请求

//得到OKHttpClient对象
OkHttpClient okHttpClient=new OkHttpClient();
//得到Request对象
Request request=new Request.Builder()
.url("http://api.36wu.com/Weather/GetWeather?district=%E5%8C%97%E4%BA%AC")
.build();
//OkhttpClient#newCall()得到Call对象
Call call=okHttpClient.newCall(request);
//Call#enqueue()请求网络
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e("fail",e.toString());
}

@Override
public void onResponse(Call call, Response response) throws IOException{
Log.e("success",response.body().toString());
}
});
}



上面注释已经很清晰了,这里就不再做解释了!
这里需要注意的一点
onResponse
回调的参数是
response
,一般情况下,比如我们希望获得返回的字符串,可以通过
response.body().string()
获取;如果希望获得返回的二进制字节数组,则调用
response.body().bytes()
;如果你想拿到返回的
inputStream
,则调用
response.body().byteStream()


POST请求

OkHttpClient okHttpClient=new OkHttpClient();
//构建RequestBody对象,调用add()方法构建我们的键值对
RequestBody body=new FormBody.Builder()
.add("district","%E5%8C%97%E4%BA%AC")
.build();
//在构建Request对象时,调用post方法,传入RequestBody对象
Request request=new Request.Builder()
.url("http://api.36wu.com/Weather/GetWeather")
.post(body)
.build();
Call call=okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e("fail",e.toString());
}

@Override
public void onResponse(Call call, Response response) throws IOException {
Log.e("success",response.body().toString());
}
});
}



这里需要注意的一点:在OKHttp3中在构建
RequestBody
对象时,已使用
FormBody
代替了之前的
FormEncodingBuilder
,这里需要注意一下!

③文件上传

文件上传,在构建RequestBody的时候:

OkHttpClient okHttpClient=new OkHttpClient();
File file = new File(Environment.getExternalStorageDirectory(), "test.txt");
RequestBody body = RequestBody.create(MediaType.parse("application/octet-stream"), file);
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addPart(Header对象,body)
//.addFormDataPart("XXX","XXX",body)
.build();
Request request = new Request.Builder()
.url("XXXX")
.post(requestBody)
.build();

Call call = okHttpClient.newCall(request);
call.enqueue(new Callback(){ });



这里需要注意的一个问题:OKHttp3中用于文件上传的
MultipartBody
,代替了之前的
MultipartBuilder
,用法也稍微的不一样,需要注意!

封装

参考一下鸿洋大神的一个对OKHttp的封装:

Android OkHttp完全解析 是时候来了解OkHttp了
http://blog.csdn.net/lmj623565791/article/details/47911083

Android 一个改善的okHttp封装库
http://blog.csdn.net/lmj623565791/article/details/49734867

源码分析

在简书上看到一个系列的博客,讲的比较细致清晰,分享一下,包括综述、复用连接池、缓存策略、DiskLruCache和任务队列等5个部分:

OkHttp3源码分析[综述]
OkHttp3源码分析[复用连接池]
OkHttp3源码分析[缓存策略]
OkHttp3源码分析[DiskLruCache]
OkHttp3源码分析[任务队列]
有空再仔细研读一下源码!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐