我正在尝试使用url编码的数据调用POST服务。 我已经编写了我的方法来将json转换为url编码的字符串。
urlEncode(reqData){
if(reqData!=null){
console.log("reqData encode:"+JSON.stringify(reqData));
let reqUrlEncodedBody = new URLSearchParams();
for(let key in reqData){
console.log("key:"+key+" ,value:"+reqData[key]);
reqUrlEncodedBody.append((key),encodeURIComponent(reqData[key]));
}
console.log("urlencoded string:"+reqUrlEncodedBody.toString());
return reqUrlEncodedBody.toString();
}
}
现在我将对象传递给它:
let validateTokenData =
{
"grant_type" : "ss:zxz.com:oox:grant_type:some",
"token":currentAuthToken
};
它的输出字符串是:
grant_type=ss:zxz.com:oox:grant_type:some&token=ghjsdassa
而不是:
ss%3Azxz.com%3Aoox%3Agrant_type%3Asome&token=ghjsdassa
基本上没有将:转换为%3A。如果我使用encodeURIComponent它变成%253A,即编码两次。
有人可以建议做什么吗?
答案 0 :(得分:2)
这是因为 reqUrlEncodedBody.toString()已将 encodeURIComponent 应用于您的参数,但正在恢复某些字符,如":"。
请参阅https://angular.io/docs/js/latest/api/http/index/URLSearchParams-class.html
中的文档此类接受$ QueryEncoder的可选第二个参数,该参数用于在发出请求之前序列化参数。默认情况下,QueryEncoder使用encodeURIComponent对参数的键和值进行编码,然后根据IETF RFC 3986:https://tools.ietf.org/html/rfc3986取消编码允许作为查询一部分的某些字符。
代码部分:
function standardEncoding(v) {
return encodeURIComponent(v)
.replace(/%40/gi, '@')
.replace(/%3A/gi, ':')
.replace(/%24/gi, '$')
.replace(/%2C/gi, ',')
.replace(/%3B/gi, ';')
.replace(/%2B/gi, '+')
.replace(/%3D/gi, '=')
.replace(/%3F/gi, '?')
.replace(/%2F/gi, '/');
}
因此,如果您真的想要对字符进行编码,则应使用文档中指定的新QueryEncoder。