内容类型为application / x-www-form-urlencoded的编码对象

时间:2019-05-20 14:51:02

标签: angular typescript ionic-framework

AngularJS代码转换为Angular 2+代码-Http问题

我正在将一些较旧的AngularJS代码(实际上是其Ionic 1)转换为较新的Angular(Ionic 4),并且遇到了一个令人讨厌的问题。

因此,在AngularJS中的每个Http Post上,以前的开发人员都在这样做:

var headers = {
  'Content-Type': 'application/x-www-form-urlencoded'
};

// Add authentication headers if required
if (token) headers['x-auth-token'] = token;
if (userid) headers['x-auth-id'] = userid;

var config = {
  url: api(endpoint),
  method: method,
  headers: headers
};

if (method == 'GET') {
  config['params'] = data;
} else {
  config['data'] = $httpParamSerializerJQLike(data);
}

return $http(config).then(function(response) {
  return response.data;
});

眼前的问题是这一行:$httpParamSerializerJQLike(data);

在Angular 2+中,此功能不存在,并且会引起问题。

有人可以帮我将其转换为较新版本的Angular吗?

这是我到目前为止所拥有的:

let headers = {
  "Content-Type": "application/x-www-form-urlencoded"
};

if (this.token) headers["x-auth-token"] = this.token;
if (this.userid) headers["x-auth-id"] = this.userid.toString();

let config = {
  url: await this.api(endpoint),
  method: method,
  headers: headers,
  body: data
};

if (method === "GET") {
  config["params"] = data;
  return await this.http.get(config["url"], config).toPromise();
} else {
  config["data"] = await this.formatData(data);
  return await this.http
    .post(config["url"], config["data"], config)
    .toPromise();
}

如您所见,我创建了这个formatData()函数,该函数试图序列化数据,但是它不能100%地工作。特别是当嵌套JSON数据时。

这是我创建的formatData函数:

async formatData(obj) {
  var str = [];
  for (var key in obj) {
    if (obj != undefined) {
      if (obj.hasOwnProperty(key)) {
        str.push(
          encodeURIComponent(key) + "=" + encodeURIComponent(obj[key])
        );
      }
    }
  }
  return str.join("&");
}

任何帮助将不胜感激!如果有人知道我可以安装的任何库或与该库类似的任何东西:$httpParamSerializerJQLike(data);

1 个答案:

答案 0 :(得分:0)

  

我已经创建了此formatData()函数,该函数尝试序列化数据,但是100%的时间都无法正常工作。特别是当嵌套JSON数据时。

如果必须使用application/x-www-form-urlencoded,请使用jQuery param对数据进行编码。

console.log($.param({a:88, b:77}));
console.log($.param({a: {b:4,c:8}}));
console.log($.param({a: [4,8]}));
<script src="//unpkg.com/jquery"></script>

对于内容类型application/x-www-form-urlencoded的JavaScript对象进行编码没有正式的标准。 jQuery库普及了param函数,作为一种编码对象和数组的方式。一些API将其理解为de-facto标准。

道格拉斯·克罗克福德(Douglas Crockford)普及了JSON.org来编码JavaScript对象和数组的正式标准,并被公认是标准RFC8258和ECMA-404。

如果可能的话,最好使用内容类型application/json