OkHttp(一)

1 简介

OkHttp是现今一个较为出众的网络通信库,可以替代原生的HTTPURLConnection,支持Http/SPDY,有着简单易用,拓展性好等优点。

2 HttpURLConnection

让我们先看看未使用OkHttp要怎样实现网络请求。

在未使用框架前,我们基本上会使用原生的HttpClient(已淘汰)和HttpURLConnection来进行发送HTTP请求。

HttpURLConnection是一种多用途、轻量级的HTTP客户端,我们大部分的应用程序可以使用它来进行HTTP操作。接下来简单使用其来发送一个Get方法的Http请求。

注意以下操作都是在子线程下进行的

  • (1)获取HttpURLConnection的实例
// 用URL对象来创建HttpURLConnection
    URL murl = new URL("https://www.baidu.com");
    HttpURLConnection connection = (HttpURLConnection)murl.openConnection;
// 设置参数(超时时间,读取超时,请求方法,header等
    connection.setConnectionTimeout(8888);
    connection.setRequestMethod("GET");
    ...
// POST请求还要将参数写入到输出流中
  • (2)连接并获取输入流,并对其处理
    connection.connect();
    mInputSteam = connection.getInputSteam();
    // 可选
    int code = mHttpURLConnection.getResponseCode();
    String respose = converStreamToString(mInputStream);
    Log.i("baidu", "请求状态码:" + code + "\n请求结果:\n" + respose);`
    //根据实际情况,来判断如何处理流数据
    mInputSteam.close();
  • (3)关闭连接
    connection.disconnect();

以上就是HttpURLConnection的一个基本操作。

3 OkHttp的使用

3.1 Get请求

    //建造者模式构建对象
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
                    .get()
                    .url("https://www.4399.com")
                    .build();
    Call call = client.newCall(request);    
try {
    //1.同步请求调用的方法是call.execute(),内部采用的是线程阻塞(一直等待直到线程返回结果)方式直接将结果返回到Response
    Response response = call.execute();
    //2.异步请求调用的方法是call.enqueue(Callback callback),该方法需要传入一个Callback等待结果回调的接口
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.w("cozing", "请求失败");
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            //在这里处理得到的Response
            Log.w("cozing", "请求成功");
        }
    });
} catch (IOException e) {
    e.printStackTrace();
}  

3.2 Post请求

    OkHttpClient client = new OkHttpClient();
    // 将参数构造成表单对象
    FormBody formBody = new FormBody.Builder()
                .add("username", "admin")
                .add("password", "admin")
                .build();
    Request request = new Request.Builder()
                    .post(formBody)
                    .url("https://www.4399.com")
                    .build();
    Call call = client.newCall(request);    
try {
    Response response = call.execute();
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.w("cozing", "请求失败");
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            //在这里处理得到的Response
            Log.w("cozing", "请求成功");
        }
    });
} catch (IOException e) {
    e.printStackTrace();
}  

以上就是OkHttp的一个基本使用,我们不难看出由于其对网络请求功能进行了封装,使得整体的代码变得更加的简洁明了。

4 OkHttp的基础类(接口)介绍

从上面的代码中,还出现了几个类,如OkHttpClient,Call, Request类等,这些暴露出来的类,涉及到我们的使用,所以接下来让我们看看这些类。

OkHttpClient

OkHttp的使用从这个类的构建开始,Client是客户端的意思,所以个人认为这个类的本质就是对使用OkHttp的客户端进行一个专门的定制。

构建举例

new OkhttpClient.Builder()
        .addInterceptor(loggingIntecepter)
        .retryOnConnectionFailure(true)
        .connectionTimeout(TIME_OUT, TimeUnit.SECONDS)
        .readTimeout(TIME_OUT, TimeUnit.SECONDS)
        .build();

OkHttpClient的构建利用了建造者模式,该模式的常用于复杂对象的构建,将构建的细节封装,具体的说明以后再说。

在该对象的构建中,我们看到了添加拦截器和连接重试等,查看源码中OkHttpClient属性可知,大部分与拦截器相关的设置都在这个对象中设置。

Request

从英语译文中可以看出,这是和请求相关的一个类,包含了请求URL等属性。我们需要这个类,来定义我们访问的类。

构建举例

Request request = new Request.BUilder()
    .url(url)
    .build();

上述例子中,也是使用了建造者模式,其中只用了一个url属性,此外还有这method(GET和POST之类),headers(请求头),requestBody(请求体)和tag。

Call

该接口是实际请求网络的接口,其实现类是RealCall,其构建方式是简单工厂模式(传入一个参数,放回一个该参数对应的对象)
其源码如下:

interface Factory {
    Call newCall(Request request);
  }
  ...
   @Override
    public Call newCall(Request request) {
        return RealCall.newRealCall(this, request, false /* for web socket */);
    }

构建方式从上面可以推导而出。

client.newCall(request) //用上了之前的两个类。

该接口及其实现类是OkHttp的一个核心内容,其有着很多东西值得去探究,下一节仔细来分析这篇文章。

5 小结

在这篇文章中,我们首先简要介绍了如何利用HttpURLConnection来进行网络请求,而后介绍了OkHttp的简单使用和在使用过程中碰到一些类。

我们算是对OkHttp有了一个小小的入门,下一节开始深入的解析OkHttp的一个执行流程。


JathonW
1 声望2 粉丝

精致唯一