认识OKHttp

认识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);
        }
    }

参考内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值