用攔截器修改返回response,對特定的返回進行修改

在開發的時候遇到這樣的需求:

小程序和ios已經上線,Android端還在調接口,我用了retrofit把所有的參數統一處理,封裝了一個公共Bean類進行擴展,然後有一個接口在特定情況下無法解析json爲公共bean類,這時候去修改bean和每個接口處理已經來不及,這時候就可以用到攔截器了,攔截器可以攔截request,可以處理url,可以設置緩存,當然也可以攔截response。

具體思路是:創建攔截器->根據chain獲取response->根據response判斷url是否需要特殊處理的->根據reponse.body().string()獲取json數據並轉換成bean類->修改bean類並創建新的responsebody和response->return修改完畢的response。

 public Interceptor getSignInInterceptor(){
        Interceptor interceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                Response response = chain.proceed(request);
                if(request.url().toString().contains(URL)) {
                    String json =response.body().string();
                    HttpResult<Object> responseResult = JsonUtil.parseJsonToBean(json,HttpResult.class);
                    if(responseResult.getCode() == 1508) {
                        responseResult.setData(null);
                        String responseJson = JsonUtil.parseObjToJson(responseResult);
                        ResponseBody myBody = ResponseBody.create(MediaType.get("text/plain"), responseJson);
                        return response.newBuilder().body(myBody).build();
                    }
                    ResponseBody myBody = ResponseBody.create(MediaType.get("text/plain"), json);
                    return response.newBuilder().body(myBody).build();
                }
                return response;
            }
        };
        return interceptor;
    }

其中有兩點需要特別注意一下:

1.ResponseBody的創建ResponseBody.create(MediaType.get("text/plain"), json);是用來根據json創建的MediaType.get("text/plain")是設置類型爲text。

2.RequestBody調用string方法之後就不能用了,所以調用完了之後即便沒有修改也需要重新去創建ResponseBody和ResPonse,否則會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章