角度为2的URLSearchParams问题

时间:2017-01-10 15:22:47

标签: angular ionic2 urlencode

我正在尝试使用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,即编码两次。

有人可以建议做什么吗?

1 个答案:

答案 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。