OKhttp拦截器requestBody类型判断失败

兰特斯 2021-01-22 11:43:29
OKhttp添加拦截器后,需要对提交的表单参数进行修改,然后在判断requestbody的时候遇到了一个问题,这句判断一直报false
if (requestBody instanceof FormBody) {

有没有大佬知道为啥啊????
完整代码:
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;
}
}

请求是:
 /**
* post请求方式
*/
@FormUrlEncoded //post请求必须要申明该注解
@POST("login") //方法名
Observable<BaseReponse<LoginRequest>> login(@Field("username") String userName, @Field("password") String password);//请求参数
...全文
530 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Time@traveler 2021-08-16
  • 打赏
  • 举报
回复
             val buffer = Buffer()//声明一个buffer
            val requestBody = request.body
             requestBody?.writeTo(buffer)//使用requestBody的writeTo函数把内容写到buffer中
            val contentType = requestBody?.contentType()
            val charset: Charset = contentType?.charset(StandardCharsets.UTF_8) ?: StandardCharsets.UTF_8 //这里主要是获取字符串编码
            val requestContent = buffer.readString(charset)//从buffer中获取requestBody里面的内容,返回一个String
            Timber.d("request.body--->${requestContent}")
兰特斯 2021-01-22
  • 打赏
  • 举报
回复

这是DEBUG的值
Lu_Muddy 2021-01-22
  • 打赏
  • 举报
回复
下断,看看那个requestBody值是啥
Lu_Muddy 2021-01-22
  • 打赏
  • 举报
回复
AS升级一下吧,可能版本太老了,奇怪的bug
兰特斯 2021-01-22
  • 打赏
  • 举报
回复
我不行,不管debug还是打log都过不去,后来改好了。Request.Builder builder = request.newBuilder();这句话在判断之后写就能正常判断了。我也不知道原理是啥,debug意外发现的奇怪变化。
Lu_Muddy 2021-01-22
  • 打赏
  • 举报
回复
我这里用你的代码,一切正常。。

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧