目录

自定义拦截器写入中文公参在网络请求时变乱码

问题现象

自定义拦截器,写入中文公参,写入时正常,网络请求时却变成乱码。代码和抓包记录如下:

问题代码示例参考如下:

private encryptParams(config: InternalAxiosRequestConfig) {
  config.transformRequest = (data: ESObject) => {
    const allParams = new HashMap<string, string>();
    const safeData: ESObject = (data && typeof data === 'object') ? data : {};
    let urlEncode = false
    if (config.headers['Content-Type'] === 'application/x-www-form-urlencoded') {
      urlEncode = true
    }
    allParams.setAll(this.getUserParams(safeData, urlEncode));
    if (allParams.hasKey(this.SIGNATURE_KEY)) {
      allParams.remove(this.SIGNATURE_KEY);
    }
    allParams.set('trader', ClientInfo.getInstance().getTrader());
    allParams.set('traderName', ClientInfo.getInstance().getTraderName());
    allParams.set('provinceId', '1')
    allParams.set('province', '1')
    allParams.set('provinceName', '上海')
    allParams.set('cityName', '上海')
    allParams.set('locateProvinceId','')
    allParams.set('locateCityName','')
    return this.getParamsUrl(allParams, urlEncode)
  }
}

背景知识

当'content-Type'为'application/x-www-form-urlencoded'时,请求提交的信息主体数据必须在key和value进行URL转码后(encodeURIComponent/encodeURI),按照键值对"key1=value1&key2=value2&key3=value3"的方式进行编码。

问题定位

分析结论

headers['Content-Type']使用'application/x-www-form-urlencoded'编码格式时,需要对请求提交的信息主体数据进行encodeURIComponent/encodeURI转码。

修改建议

建议代码中增加URL转码(encodeURIComponent/encodeURI)例如:

allParams.set('cityName', encodeURIComponent('上海'))