前言:Okhttp3是一个强大的网络请求下载开源框架,本文将会对OkHttp3进行全面解析以及在代码中穿插butterknife的使用。
我将对OkHttp3进行下面六种用途的讲解:
- GET请求
- POST请求(Form表单形式)
- POST请求(JSON格式)
- 文件下载(简单方式)
- 文件下载(拦截器方式)
OkHttp3的简单封装
1.GET请求
对于网络加载库,那么最常见的肯定就是http get请求了,比如获取一个网页的内容。
//我们想像为生成一个客户端
OkHttpClient client = new OkHttpClient();
String url = "http://192.168.1.189:5000/user/info?id=1";
Request request = new Request.Builder()
.url(url)
.build();
//请求加入调度
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d("MainActivity","失败------"+e.getLocalizedMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
Log.d("MainActivity","成功:"+result);
if(response.body() !=null){
response.body().close();
}
}
});
我们得注意几点:
- 上传下载功能必须得用异步的方式进行,所以调用call.enqueue,将call加入调度队列,然后等待任务执行完成,我们在Callback中即可得到结果。
- onResponse回调的参数是response,我们希望获得返回的字符串,可以通过response.body().string()获取;这里我们要注意,把流形式转化为字符串用.string(),把Object形式的对象转化为字符串用.toString().
- 以流形式操作我们就可以通过IO的方式写文件。不过也说明一个问题,这个onResponse执行的线程并不是UI线程。的确是的,如果你希望操作控件,还是需要使用handler等。
@Override
public void onResponse(final Response response) throws IOException
{
final String res = response.body().string();
runOnUiThread(new Runnable()
{
@Override
public void run()
{
mTv.setText(res);
}
});
}
在平时的学习中,我以及碰到好几次开源框架,如Fresco,OkHttp的代码用如下形式:
Request request = new Request.Builder()
.url(url)
.build();
我们对Request的源码进行分析,看看内部如何设计:
public final class Request {
//静态内部类,所以可以用类访问,以及类直接调用构造器:new Request.Builder()来得到一个builder对象。
public static class Builder{
//方法返回一个Builder对象
public