javascript - 从对象创建URI字符串

时间:2017-08-22 12:29:56

标签: javascript api react-native get encodeuricomponent

我在javascript

中有以下变量
var domain= http://example.com/api/v1/purchases/get_purchases.json?
var header = 'df0a96ddbe1ada9fda4b1ed9b02cf67c'
var params = {
                   search:{
                         status_eq: 'frozen',
                         email_eq: 'a@a.com',
                         phone_number_eq: ''
                   }
                  }
var api_string = domain + header + params;

我需要输出api_string为:

http://example.com/api/v1/purchases/get_purchases.json?headers%5B_token%5D=df0a96ddbe1ada9fda4b1ed9b02cf67c&search%5Bemail_eq%5D=a@a.com&search%5Bphone_number_eq%5D=12345&search%5Bstatus_eq%5D=frozen

我尝试了JSON.stringify, encodeURI, encodeURIComponent,但它没有按预期工作。

我需要在api_string的{​​{1}}函数中使用此fetch

3 个答案:

答案 0 :(得分:1)

您可以使用序列化功能,如下所示:

serialize = function(obj, prefix) {
  var str = [], p;
  for(p in obj) {
    if (obj.hasOwnProperty(p)) {
      var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
      str.push((v !== null && typeof v === "object") ?
        serialize(v, k) :
        encodeURIComponent(k) + "=" + encodeURIComponent(v));
    }
  }
  return str.join("&");
}

console.log(serialize(params));

给予:

search%5Bstatus_eq%5D=frozen&search%5Bemail_eq%5D=a%40a.com&search%5Bphone_number_eq%5D=`

答案 1 :(得分:0)

好消息,字符串连接只需+运算符即可完成。所以你可以做这样的事情

let result = domain + "headers%5B_token%5D=" + header + "&search%5Bemail_eq%5D=" + params.search.eqmail_eq

(显然对其余的参数进行扩展,假设你只有这三个参数)

答案 2 :(得分:0)

您是否尝试过使用npm包url

这是一个如何运作的例子:

    const url = require('url')

    let my_url = url.format({
          hostname: "mydomain.com",
          protocol: "http",
          query: {status_eq: 'frozen', email_eq: 'a@a.com',},
          pathname: '/my/path'
    })

here is the documentation如果你需要了解它的工作原理。

警告

url.format接收您要发送到服务器的参数的对象。如果要传递的参数之一是对象,请确保在将其添加到查询之前对其进行JSON.stringify。 Here is a stackoverflow question解释了它。