美文网首页
解决Retrofit 2.3以上post请求中文参数乱码(解决公

解决Retrofit 2.3以上post请求中文参数乱码(解决公

作者: 萨本 | 来源:发表于2019-08-09 20:07 被阅读0次

首先先了解为什么会乱码 ------------->

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 在哪加上去呢?前面的MediaTypeprivate 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");

相关文章

网友评论

      本文标题:解决Retrofit 2.3以上post请求中文参数乱码(解决公

      本文链接:https://www.haomeiwen.com/subject/dklkjctx.html