上一篇博客了解了Retrofit的使用,它是对OKHttp的封装,且Retrofit2的内部实现是OKHttp3,下面就了解一下OKHttp3的使用!
①首先导入依赖,最新的版本是3.4.1,在gradle中:
compile 'com.squareup.okhttp3:okhttp:3.4.1'
OKHttp内部依赖Okio库,所以也要添加Okio库,最新版本为1.9.0:
compile 'com.squareup.okio:okio:1.9.0'
②发送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个部分:
有空再仔细研读一下源码!!!!