麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統 > Android > 正文

深入了解OkHttp3之Interceptors

2019-10-21 21:31:16
字體:
來源:轉載
供稿:網友

OKHttp官網上面介紹:攔截器是一種強大的機制,可以監視,重寫和重試調用。這里我們主要對攔截器的網絡請求頭和數據請求的封裝。

網絡請求頭攔截器

在Android應用中,我們通常需要獲取用戶手機的IMEI值和其他一些常用的參數,如果把他們封裝到請求頭里面的話會非常的方便。

既然是自定義攔截器,我們首先肯定要繼承OKHttp的攔截器,把這個自定義類設置成 final 類型的防止其他類繼承。

這里需要在父類的intercept(Chain chain)方法中進行操作。在方法里面得Request.Builder對象然后添加請求頭。

創建一個BaseParam 對象,對請求頭的參數進行封裝。

public final class HeaderInterceptorTest implements Interceptor {  /**   * 請求頭參數基礎參數   */  private static final String HEADER_BASE_PARAM = "baseParam";  private static String BASE_PARAM;  @Override  public Response intercept(Chain chain) throws IOException {    Request.Builder builder = chain.request().newBuilder();    builder.addHeader(HEADER_BASE_PARAM, BASE_PARAM);    return chain.proceed(builder.build());  }  public static void initBaseParam(Context context) {    BaseParam baseParam = new BaseParam();    String imei;    String imsi;    try {      imei = DeviceInfoUtil.getIMEI(context);    } catch (Exception e) {      imei = null;    }    if (null == imei || imei.equals("")) {      imei = DeviceInfoUtil.getDeviceID(context);      imsi = DeviceInfoUtil.getDeviceID(context);    } else {      imei = DeviceInfoUtil.getIMEI(context);      imsi = DeviceInfoUtil.getIMSI(context);    }    baseParam.setImei(imei);    baseParam.setImsi(imsi);    baseParam.setMac(DeviceInfoUtil.getWifiMAC(context));    baseParam.setVersion(DeviceInfoUtil.getVersion(context));    baseParam.setModel(DeviceInfoUtil.getModel());    baseParam.setBrand(DeviceInfoUtil.getBrand());    BASE_PARAM = new Gson().toJson(baseParam).toString();  }  private static class BaseParam {    /**     * imei :     * imsi :     * mac :     * version :     * model :     * brand :     * city :     */    private String imei;    private String imsi;    private String mac;    private String version;    private String model;    private String brand;    private String city;    public String getImei() {      return imei;    }    public void setImei(String imei) {      this.imei = imei;    }    public String getImsi() {      return imsi;    }    public void setImsi(String imsi) {      this.imsi = imsi;    }    public String getMac() {      return mac;    }    public void setMac(String mac) {      this.mac = mac;    }    public String getVersion() {      return version;    }    public void setVersion(String version) {      this.version = version;    }    public String getModel() {      return model;    }    public void setModel(String model) {      this.model = model;    }    public String getBrand() {      return brand;    }    public void setBrand(String brand) {      this.brand = brand;    }    public String getCity() {      return city;    }    public void setCity(String city) {      this.city = city;    }  }}

數據請求攔截器

在進行數據請求的時候,一般都會定義一種固定的請求格式。在這里我們直接通過攔截器,將這個固定的格式定義好,這樣使用起來可以統一管理。具體的使用方法其實和上面一樣。

主要注意的是先得到,請求時設置的請求體,然后讓請求的數據封裝到和后端設置的請求格式里面。

public class HttpDataPackInterceptorTest implements Interceptor {  @Override  public Response intercept(Chain chain) throws IOException {    Request request = chain.request();    Request.Builder requestBuilder = chain.request().newBuilder();    //請求數據處理    if (request.url().toString().contains("uploads")) {      //特殊接口的參數不需要處理的    } else {      //需要處理請求參數的      if (request.body() instanceof FormBody) {        FormBody.Builder newFormBody = new FormBody.Builder();        //得到請求時設置的請求體        FormBody oldFormBody = (FormBody) request.body();        Buffer buffer = new Buffer();        oldFormBody.writeTo(buffer);        String postParams = JsonUtils.getJsonStrFromPostParams(buffer.readString(Charset.forName("UTF-8")));        String data = URLDecoder.decode(postParams, "UTF-8");        if (TextUtils.isEmpty(data)) {          newFormBody.add("data", "");        } else {          //將請求的數據封裝          newFormBody.add("data", data);        }        requestBuilder.method(request.method(), newFormBody.build());      }    }    return chain.proceed(requestBuilder.build());  }}

代碼中調用

在創建OkHttpClient 對象的時候,調用 addInterceptor()方法 添加倆個攔截器。

private OkHttpClient client;  @Override  protected void onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_okhttp);    HeaderInterceptorTest.initBaseParam(this);    client= new OkHttpClient()        .newBuilder()        .addInterceptor(new HeaderInterceptorTest())        .addInterceptor(new HttpDataPackInterceptorTest())        .connectTimeout(60, TimeUnit.SECONDS)        .writeTimeout(60, TimeUnit.SECONDS)        .readTimeout(60, TimeUnit.SECONDS).build();    okhttpAsyncPost();  }  private void okhttpAsyncPost(){    RequestBody formBody = new FormBody.Builder()        .add("page", "1")        .add("count", "2")        .add("type","video")        .build();    Request request = new Request.Builder()        .url("https://api.apiopen.top/getJoke")        .post(formBody)        .build();    client.newCall(request).enqueue(new Callback() {      @Override      public void onFailure(Call call, IOException e) {      }      @Override      public void onResponse(Call call, Response response) throws IOException {        Log.e("error","結果"+response.body().string());        Log.e("error","方法"+response.request().toString());        Log.e("error","請求頭"+response.request().headers().toString());      }    });  }

打印的日志

結果{"status":200,"msg":"OK","data":"{/"count/":/"2/",/"page/":/"1/",/"type/":/"video/"}"}
方法Request{method=POST, url=https://www.26uuun.com/list, tags={}}
請求頭baseParam: {"brand":"Xiaomi","city":"/u4e1c/u4eac","imei":"9fc70b16bf169075f556e6d67be9ef1a","imsi":"9fc70b16bf169075f556e6d67be9ef1a","mac":"02:00:00:00:00:00","model":"Mi Note 2","version":"1.0"}

OK,OKHttp3中Interceptors配置完成,小伙伴們,可以設置自己不同需求的其他的攔截器添加到請求中。

最近我會寫很多關于Android常用控件的使用,里面都是一些很有用的知識,如果你感覺有用,請給我一個star,謝謝。 代碼實例 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品久久久久久久午夜片 | 成人在线高清视频 | 久久久久久久久久久久久久久久久久 | 中日无线码1区 | 91精品国产乱码久久久久久久久 | 天天躁狠狠躁夜躁2020挡不住 | 午夜在线视频观看 | 国产在线观看一区二区三区 | 福利免费在线 | 91精品国产九九九久久久亚洲 | 日本高清电影在线播放 | 久久精品探花 | 黄色片视频观看 | 国产成人在线一区二区 | 亚洲综合视频网站 | 香蕉久草视频 | 亚洲人成免费 | 国产精品美女久久久久久不卡 | 污污黄 | 亚洲人成网站免费播放 | 91福利影视 | 久久精品超碰 | 国产日韩中文字幕 | 亚洲国产精品高潮呻吟久久 | 国产精品99久久久久久久女警 | 激情综合网俺也去 | 在线中文字幕亚洲 | 国产二区三区在线播放 | 少妇淫片免费一级毛片 | 亚洲va久久久噜噜噜久牛牛影视 | 成人午夜影院 | 久综合色 | 欧美日韩高清不卡 | 北原夏美av| 手机av在线电影 | 久久久综合视频 | 欧美高清第一页 | 国产精品视频成人 | 一区二区久久久久草草 | 国产成人高清成人av片在线看 | 黄视频网站免费在线观看 |