您的位置:首页 > 理论基础 > 计算机网络

OkHttp - 拦截器(Interceptor) 重新定义请求 Request

2016-08-07 16:37 507 查看

背景

项目使用的OkHttp和Retrofit,但目前要改了新的接口方式,不采用Restful的风格,所以对Retrofit的网络底层实现,是一个致命的打击。这时候就需要在OkHttp上做一些摸索了,即 - 拦截器 (InterCeptor)。

思路

思路很简单:拿到请求的Request对象,改变请求地址和请求数据(or 重新封装),返回新的Request,继续进行请求。

实现

(1)继承 Interceptor 接口,并实现intercept方法

public class NetWorkInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
}
}


(2)通过chain 对象获取Request对象

Request request = chain.request();


(3)通过request.body与FormBody 重新封装参数

if(request.body() instanceof FormBody) {
FormBody body = (FormBody) request.body();
if (body.size() > 0) {
//封装参数
for (int i = 0; i < body.size(); i++) {
Log.d(TAG, body.encodedName(i) + " >>>> " + body.encodedValue(i));
Log.d(TAG, body.name(i) + " >>>> " + body.value(i));
params.getP().add(body.encodedValue(i));
}
}
}


(4)通过FormBody.Builder和Request.Builder重新生成Request

FormBody.Builder newFormBuilder=new FormBody.Builder();
newFormBuilder.addEncoded(PARAMS_DATA, CryptUtil.enCryPto(params));
Request.Builder builder=request.newBuilder();
builder.url(HTTP_HOST_API);
builder.method(request.method(),newFormBuilder.build());
Request newRequest= builder.build();


(5)返回 Response

return chain.proceed(newrequest);


附件 :

具体见 :initRequest方法实现

import android.util.Log;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

/**
* Created by yuan on 2016/8/5.
*/
public class NetWorkInterceptor implements Interceptor {

@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Log.d(TAG,request.url().host());

if(request.url().host().equals(HTTP_OLD_HOST_API)){
//需要修改
//通过一些条件进行判断,然后返回新的Request
switch (request.url().encodedPath()){
case HTTP_OLD_HOST_BANNER:
Request initRequest = initRequest(request, maps.get(HTTP_OLD_HOST_BANNER));
return chain.proceed(initRequest);
}
}
return chain.proceed(request);
}

/**
* 重新封装参数
* @param request 旧的Request
* @param params 封装的bean
* @return 修改后的Request
*/
private Request initRequest(Request request,BaseNetParams params){
if(request.body() instanceof FormBody) {
FormBody body = (FormBody) request.body();
if (body.size() > 0) {
//封装参数
for (int i = 0; i < body.size(); i++) {
Log.d(TAG, body.encodedName(i) + " >>>> " + body.encodedValue(i));
Log.d(TAG, body.name(i) + " >>>> " + body.value(i));
params.getP().add(body.encodedValue(i));
}
}
}
FormBody.Builder newFormBuilder=new FormBody.Builder();
newFormBuilder.addEncoded(PARAMS_DATA, params);
Request.Builder builder=request.newBuilder();
builder.url(HTTP_HOST_API);
builder.method(request.method(),newFormBuilder.build());
return builder.build();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  interceptor okhttp request
相关文章推荐