public final class FormBody extends RequestBody {
private static final MediaType CONTENT_TYPE = MediaType.get("application/x-www-form-urlencoded");
...
2.3以后 post 请求的RequestBody 默认的 Content-type 没有 charset=utf-8 了
百度一般解决方式是加上这句
@Headers("Content-Type:application/x-www-form-urlencoded; charset=utf-8")
然鹅这会使你统一的请求参数拦截失效,具体原因上述链接里有,就是
ContentTypeOverridingRequestBody 替换了你的 FormBody
所以你添加统一的请求参数就没啦
那这个 charset=utf-8 在哪加上去呢?前面的MediaType是private static final的我们也不能改
FormBody类的源码里找到了这句
public static final class Builder {
private final List<String> names = new ArrayList<>();
private final List<String> values = new ArrayList<>();
private final Charset charset;
public Builder() {
this(null);
}
public Builder(Charset charset) {
this.charset = charset;
}
...
so
//创建一个新的FromBoby
FormBody.Builder bobyBuilder = new FormBody.Builder(Util.UTF_8);
public Response intercept(Chain chain) throws IOException {
//获取request
Request request = chain.request();
HttpUrl url = request.url();
//判断当前的请求
if (request.method().equals("POST")) {
//判断当前的请求Boby
if (request.body() instanceof FormBody) {
//创建一个新的FromBoby
FormBody.Builder bobyBuilder = new FormBody.Builder(Util.UTF_8);
//获取原先的boby
FormBody body = (FormBody) request.body();
//遍历boby
for (int i = 0; i < body.size(); i++) {
//取出原先boby的数据 存入新的boby里
bobyBuilder.addEncoded(body.encodedName(i), body.encodedValue(i));
}
FormBody.Builder里传入Util.UTF_8就可以啦
public static final Charset UTF_8 = Charset.forName("UTF-8");
网友评论