OkHttp的使用总结

一、使用导入依赖

dependencies{
//...
//OkHttp
implementation'com.squareup.okhttp3:okhttp:3.14.2'
implementation'com.squareup.okio:okio:1.17.4'
}
需要注意OkHttp在3.13.x以上的版本需要在Android 5.0+和java1.8的环境开发。Okio在1.x版本是基于Java实现的,2.x则是Kotlin实现的。

二、关键类和方法

OkHttpClient:客户端对象
Request:访问请求,Post请求中需要包含RequestBody
RequestBody:请求数据,在Post请求中用到
Response:网络请求的响应结果
Interceptor:拦截器,能够监控,重写以及重试(请求的)调用
MediaType:数据类型,用来表明数据是json,image,pdf等一系列格式
client.newCall(request).execute():同步的请求方法。
client.newCall(request).enqueue(Callback callback):异步的请求方法
注意点:Callback是执行在子线程中的,不能在此更新UI操作,okhttp2.2以后才有拦截器的概念。

三、使用方式

1.同步get:需要自己写子线程请求

public void getSyn(final String url){
new Thread(new Runnable(){
        @Override
        public void run(){
            try{
              //创建OkHttpClient对象
            OkHttpClient client = new OkHttpClient();
            //创建Request
            Request request = new Request.Builder().url(url).get().build();
            //创建Call对象
            Call call = client.newCall(request);
            Response response = call.execute();
            if(response.isSuccessful()){
                    //处理响应后的事情
              }
            }catch(Exception e){
            }
      }
}).start();
}

2.异步get

public void getAsyn(String url){
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder().url(url).build();
    Call call = client.newCall(request);
    call.enqueue(new Callback(){
    @Override
    public void onFailure(Call call, IOException e){
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if(response.isSuccessful()){
            String result = response.body().string();
            //处理事情
        }
   }
});
}

说明:Request.Builder 中默认使用get请求,所以可以不调用get()方法

3.post请求

1、创建OkHttpClient对象
OkHhttpClient okHttpClient = new OkHttpClient();
//RequestBody中的MediaType指定为纯文本,编码方式是utf-8
RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain;charset=utf-8"));
//2.创建Request对象,设置一个地址,设置请求方式。
Request request = new Request.Builder().url("http://www.baidu.com").post(requestBody).build();
//3.创建一个call对象,参数是Request请求对象
Call call = okHttpClient.newCall(request);
//4.请求加入调度,重写回调方法
call.enqueue(new Callback(){
      @Override
       public void onFailure(Call call, IOException e){
            String err = e.getMessage().string();  
      }
       @Override
      public void onResponse(Call call, Response response) throws IOException{
          final String rtn = response.body().toString();
          //获取返回码
          final String code = String.valueOf(response.code());
          runOnUiThread(new Runnable() {
                @Override
                public void run() {
                }
              );
      }
});

其中RequestBody可以是JSON,表单,键值对,文件等

RequestBody body = RequestBody.create(JSON, json);

表单

MultipartBody.Builder mBuild = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("username","xxx").
addFormDataPart("password","xxx");
RequestBody requestBody = mBuild.build();

四、请求流程

基本流程都是先创建一个OkHttpClient对象,然后通过Request.Builder()创建一个Request对象,OkHttpClient对象调用newCall()并传入Request对象就能Call对象。而同步和异步不同的地方在于execute()和enqueue()方法的调用,调用execute()为同步请求并返回Response对象,调用enqueue()方法通过callback的形式返回Response对象。
其中这两个方法最终会调用RealCall总的getResponseWithInterceptorChain
()方法,从拦截器链中获取返回结果;拦截器链中,依次通过RetryAndFollowUpInterceptor、BridgeInterceptor、CacheInterceptor、ConnectInterceptor、CallServerInterceptor,与服务器建立连接后,获取返回数据,在经过上述拦截器依次处理后,最后将结果返回给调用方。


image.png

五、拦截器

拦截器的作用:可以在应用拿到response之前,先获得response,对其某些数据进行监控,在有必要的情况下,对response中某些内容比如response的header,body,response内的request的header,body进行更改。

1.okhttp内的拦截器

重拾及重定向拦截器RetryAndFollowUpInterceptor: 负责请求的重试和重定向
桥接拦截器BridgeInterceptor:给请求添加对用的header信息,处理响应结果的header信息
缓存拦截器CacheInterceptor:根据当前获取的状态选择网络请求、读取缓存、更新缓存。
连接拦截器ConnectInterceptor:建立http连接。
读写拦截器CallServerInterceptor:通过连接好的通道进行数据的交换;

2.自定义拦截器

1)ApplicationInterceptor(应用拦截器)
2)NetworkInterceptor(网络拦截器)
应用拦截器作用于okhttpCore和Application之间,网络拦截器作用于network和okhttpCore之间,添加应用拦截器的接口是addInterceptor(),而添加网络拦截器的接口是addNetworkInterceptor();

3.应用场景

NetworkInterceptor:记录日志
ApplicationInterceptor:动态添加请求公共参数,检查请求路径权限(如是否登录状态)
说明:在某些特殊情况下,网络拦截器可能被执行多次,但是applicationInterceptor只会被执行一次。

六、其他设置

1.请求头

addHeader(String name, String value) :添加header信息
removeHeader(String name):移除header信息
header(String name, String value):重新设置指定name的header信息
headers(Headers headers):移除原有的header信息,将参数headers添加到请求中

2.时间相关

OkHttpClient mClient = new OkHttpClient.Builder()
    .callTimeout(6_000, TimeUnit.MILLISECONDS)
    .connectTimeout(6_000, TimeUnit.MILLISECONDS)
    .readTimeout(20_000, TimeUnit.MILLISECONDS)
    .writeTimeout(20_000, TimeUnit.MILLISECONDS)
    .build();

你可能感兴趣的:(OkHttp的使用总结)