【问题标题】:javascript - creating URI string from objectsjavascript - 从对象创建 URI 字符串
【发布时间】:2018-01-30 17:50:57
【问题描述】:

我在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,但它没有按预期工作。

我需要在react-nativefetch函数中使用这个api_string

【问题讨论】:

标签: javascript api react-native get encodeuricomponent


【解决方案1】:

您是否尝试过使用 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 解释它。

【讨论】:

  • 嗯,奇怪,你能评论一下你想格式化的对象吗?
  • 这是我正在尝试的对象.. var params = { search:{ status_eq: '', email_eq: 'a@a.com', phone_number_eq: '' } }
  • 我知道发生了什么。您正在将对象作为值传递。在这种情况下,您需要 JSON.stringify 传递给搜索的对象。如果更多人遇到此问题,我将更新我的答案!
  • params 对象是 API 调用的结果。我不知道其中的嵌套级别。我该如何处理?
  • JSON.stringify 将处理任何嵌套级别。您需要在第一层调用它。所以在你的情况下,无论你传递给搜索。
【解决方案2】:

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

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

(显然将其扩展到其余参数,假设您只有这三个参数)

【讨论】:

  • 我正在尝试编写一个可以处理任何类型参数的函数。所以这不会有帮助。无论如何,谢谢你的帮助......
【解决方案3】:

您可以使用序列化函数,如下所示:

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=`

【讨论】:

  • 是的,这很好用.. 但是我们还有其他 npm、javascript 函数吗?
  • @subha 如果你正在寻找一个 npm 函数,我想我的答案可能适合你
  • 我不明白你的问题@subha - “但是我们还有其他的 npm、javascript 函数吗?” - 你能详细说明吗?
  • @Stuart 我的意思是说我更愿意使用一些现有的库,我可以依赖这些库来处理所有边缘情况......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
相关资源
最近更新 更多