认识OKHttp

来源:互联网 发布:靠谱泰国代购淘宝 知乎 编辑:程序博客网 时间:2024/06/17 12:48

认识OKHttp

  • OKHttp介绍
  • OKHttp基本配置
  • OKHttp基本使用
  • 2.X与3
  • 代码实例
  • 参考内容

OKHttp介绍

OkHttp是一款较为轻量级的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。
其中:
内置连接池,支持连接复用,减少延迟。相同重复的request将复用原先的connection,减少握手的次数,大幅提高效率。连接池类位于okhttp3.ConnectionPool
简单了解一下源码,其基本运作逻辑:在put新连接到队列的时候会先执行清理闲置连接的线程,线程中不停调用Cleanup 并返回下次清理的间隔时间。继而进入wait 等待之后释放锁,继续执行下一次的清理。理解为监测时间并释放连接的后台线程。

OKHttp基本配置

  • 添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
  • 导入
    MAVEN
<dependency>  <groupId>com.squareup.okhttp3<groupId>  <artifactId>okhttp<artifactId>  <version>3.2.0<version><dependency>

GRADLE

compile &#39;com.squareup.okhttp3:okhttp:3.2.0&#39;

OKHttp基本使用

  • GET请求
    Request:是用来构建一个请求对象的,符合Http请求的标准,包含了请求头,方法等等属性,较为复杂,因此同样提供Builder模式构建
    Response:是用来构建一个响应对象的,包含了响应头,响应码,数据等等属性,同样也提供Builder模式构建
    同步和异步请求,都是调用OkHttpClient的newCall方法创建一个RealCall对象,然后通过这个对象,执行请求的
OkHttpClient client = new OkHttpClient();String run(String url) throws IOException {    Request request = new Request.Builder().url(url).build();    Response response = client.newCall(request).execute();    if (response.isSuccessful()) {        return response.body().string();    } else {        throw new IOException("Unexpected code " + response);    }}
  • 异步GET请求
    execute()改为enqueue()方法,并给出回调接口。
client.newCall(request).enqueue(new Callback() {    @Override    public void onFailure(Call call, IOException e) {    }    @Override    public void onResponse(Call call, Response response) throws IOException {    }});
  • POST请求
    大作业中就遇到了POST方法提交JSON数据的情景,只需要额外通过RequestBody创建一个消息体。
private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");public static String jsonPost(String url, String json) throws IOException {        OkHttpClient client = new OkHttpClient();        RequestBody body = RequestBody.create(JSON, json);        Request request = new Request.Builder()                .url(url)                .post(body)                .build();        Response response = client.newCall(request).execute();        if (response.isSuccessful()) {            return response.body().string();        } else {            throw new IOException("Unexpected code " + response);        }    }

2.X与3

比较一下OKHttp3和2.X的老版本在哪些方面做出了改变,更利于开发人员的编程工作。

  • OkHttpClient创建方式不同
    okhttp直接new OkHttpClient实例,而okhttp3中提供了Builder,很好的使用了创建者设计模式
  • post消息体构建方式不同
    okhttp主要使用FormEncodingBuilder构建post消息体,okhttp3增加了RequestBody的子类,构造器放到了RequestBody的子类中,MultipartBody.Builder既可以添加表单数据,也可以添加文件等二进制数据
  • Cookie管理
    3.0 之后新增了两个类Cookiejar、Cookie两个类,开放接口,需要用户自己去实现cookie的配管理。
    而2.X的版本使用CookieHandler进行委托管理
/* cookie管理 */  mCookieHandler = new CookieManager(null, CookiePolicy.ACCEPT_ALL);  mOkHttpClient.setCookieHandler(mCookieHandler);

代码实例

项目中简单应用的两个方法贴上来,使用的是2.X的版本,涉及到http请求头的Authorization身份验证,POST请求,GET请求

    public static String jsonPost(String url, String json) throws IOException {        OkHttpClient client = new OkHttpClient();        RequestBody body = RequestBody.create(JSON, json);        Request request = new Request.Builder()                .url(url)                .post(body)                .build();        Response response = client.newCall(request).execute();        if (response.isSuccessful()) {            return response.body().string();        } else {            throw new IOException("Unexpected code " + response);        }    }    public static String authGet(final String url, final String username, final String password) throws IOException {        OkHttpClient client = new OkHttpClient();        String auth = username + ":" + password;        String token = Base64.encodeToString(auth.getBytes(), Base64.DEFAULT);        Request request = new Request.Builder()                .url(url)                .addHeader("Authorization", "Basic " + token)                .build();        Response response = client.newCall(request).execute();        if (response.isSuccessful()) {            return response.body().string();        } else {            throw new IOException("Unexpected code " + response);        }    }

参考内容

  • OKHttp官网:http://square.github.io/okhttp/