Retrofit 中文参数乱码问题

网站中文用户名登录,结果出错,网上的结论说是

@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 names = new ArrayList<>();
private final List 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”);

最终的解决方案是将中文参数封装成类,然后在接口类前加个请求头解析这个类。
@BodyConverter(builderClassName=“builder类”)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值