在開發的時候遇到這樣的需求:
小程序和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,否則會報錯。