我用这边需要对上传到服务器的参数做修改。所以给OKHttp家了一个拦截器。但是在判断requestbody类型的时候遇到了问题,判断是否为FormBody的时候一直返回false,求问怎么解决。
请求:
/**
* post请求方式
*/
@FormUrlEncoded //post请求必须要申明该注解
@POST("login") //方法名
Observable<BaseReponse<LoginRequest>> login(@Field("username") String userName, @Field("password") String password);//请求参数
拦截器:
public class RequestInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request.Builder builder = request.newBuilder();
if (request.method().equals("POST")) {
RequestBody requestBody = request.body();
Loger.i(getClass().getName(), request.body().getClass().getName());//这里打印出来是ContentTypeOverridingRequestBody
if (requestBody instanceof FormBody) { //这里判断永远是false
FormBody formBody = (FormBody) requestBody;
LinkedHashMap<String, Object> hashMap = new LinkedHashMap<>();
for (int i = 0; i < formBody.size(); i++) {
hashMap.put(formBody.encodedName(i), formBody.encodedValue(i));
}
builder.post(getRequestBody(hashMap));
}
}
Log.v(getClass().getName(), "request:" + request.toString());
Log.v(getClass().getName(), "request headers:" + request.headers().toString());
return chain.proceed(builder.build());
}
public static RequestBody getRequestBody(HashMap<String,Object> hashMap){
Gson gson = new Gson();
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=UTF-8"),gson.toJson(hashMap));
return requestBody;
}
}
拦截器调用:
//初始化Okhttp,绑定拦截器事件
OkHttpClient client = new OkHttpClient.Builder().
connectTimeout(30, TimeUnit.SECONDS). //设置请求超时时间
readTimeout(30, TimeUnit.SECONDS). //设置读取数据超时时间
writeTimeout(30, TimeUnit.SECONDS) //设置写入数据超时时间
.addInterceptor(new RequestInterceptor()) //绑定header拦截器
.addNetworkInterceptor(InterceptorUtil.LogInterceptor() )
.addInterceptor(InterceptorUtil.LogInterceptor()) //绑定日志拦截器
.build();
Retrofit retrofit = new Retrofit.Builder().
addConverterFactory(GsonConverterFactory.create()). //设置gson转换器,将返回的json数据转为实体
addCallAdapterFactory(RxJava2CallAdapterFactory.create()). //设置CallAdapter
baseUrl(ApiHttpClient.getDefaultApiUrl()).
client(client) //设置客户端okhttp相关参数
.build();
debug的截图: