【问题标题】:NodeJS: Request Library - What is the Proper way to use userQueryString?NodeJS:请求库 - 使用 userQueryString 的正确方法是什么?
【发布时间】:2020-01-14 21:22:47
【问题描述】:

Within the Request Documentation 它记录了设置“useQuerystring”,内容如下:

useQuerystring - if true, use querystring to stringify and parse querystrings, otherwise use qs (default: false). Set this option to true if you need arrays to be serialized as foo=bar&foo=baz instead of the default foo[0]=bar&foo[1]=baz.

我正在使用的 API 需要向同一个参数名称发送多个值;这个设置似乎在使用 useQueryString 时可以完成,但我似乎无法弄清楚在哪里/如何传递查询字符串以便正确处理它以及在什么格式内执行它。

例如我在下面的代码中为查询字符串尝试了许多不同的地方:

let options = {
    uri: "https://api.mysite.com"[0],
    headers: {
        'Authorization': 'Bearer TOKEN_VALUE'
    },
    json: true,
    useQuerystring: true,
    querystring: "foo=bar&foo=baz",
    qs: "foo=bar&foo=baz",
    proxy: "http://localhost:8080",
    strictSSL: false,

};

request.get(options);

当我在“查询字符串”选项中传递查询字符串时,它会忽略它(又名,它似乎是错误的位置)。当我把它放在“qs”的“正常”位置时;我最终将以下 URL 发送到服务器:

"?0=f&1=o&2=o&3=%3D&4=b&5=a&6=r&7=%26&8=f&9=o&10=o&11=%3D&12=b&13=a&14=z"

使用设置为 true 时传递查询字符串的正确方法是什么?

根据以下文件,它看起来并没有改变查询字符串的位置,所以我认为它是 qs;但如上所述,这不起作用: https://github.com/request/request/blob/master/lib/querystring.js

感谢您的帮助!

【问题讨论】:

    标签: node.js node-request


    【解决方案1】:

    文档中的措辞有点误导。

    当它说使用 querystring 时,这意味着 request 模块将使用 querystring 模块将您的 qs 参数构建为查询字符串.或者您可以使用 querystring.parse(...) 将查询字符串解析为对象,然后将该对象传递给 qs 参数。

    我相信这是您尝试做的正确用法:

    const req = require('request');
    
    const opts = {
        foo: 'bar',
        bar: 'foo',
        arr: ['foo', 'bar', 'etc']
    };
    
    const apiOptions = {
        uri: 'http://testyurl.com',
        headers: {},
        json: true,
        useQuerystring: true,
        qs: opts
    };
    
    req.get(apiOptions);
    
    //This yields: http://testyurl.com/?foo=bar&bar=foo&arr=foo&arr=bar&arr=etc
    

    未能设置 useQuerystring: true 参数会产生一些奇怪的东西,就像你看到的那样:

    http://testyurl.com/?foo=bar&bar=foo&arr%5B0%5D=foo&arr%5B1%5D=bar&arr%5B2%5D=etc
    

    因为 request 试图转义 url 中的 arr[0]、arr[1] 和 arr[2]。

    也是一种选择:

    const opts = {
        foo: 'bar',
        bar: 'foo',
        arr: ['foo', 'bar', 'etc']
    };
    
    const querystring = require('querystring');
    const uri = 'http://testyurl.com' + querystring.stringify(opts);
    
    // yields: http://testyurl.comfoo=bar&bar=foo&arr=foo&arr=bar&arr=etc
    

    【讨论】:

    • 谢谢!它的 arr: ['foo', 'bar', 'etc'] 格式与 userQueryString=true 的组合符合我的要求!
    【解决方案2】:

    您需要将查询字符串作为键值对的对象传递。我刚刚测试了它的工作原理。

    const opts = {
      url: "https://api.mysite.com"[0],
      headers: {
        'Authorization': 'Bearer TOKEN_VALUE'
       },
      qs: {
        foo: 'bar',
        ha: 'ra'
      }
    }
    request.get(opts, function(err, data) {
      if (err) {
        throw err
      }
      console.log(data)
    })
    

    【讨论】:

    • 如果我将它作为一个对象传递,我如何根据我的示例为同一个键设置多个值?
    猜你喜欢
    • 1970-01-01
    • 2015-09-06
    • 2014-09-23
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 2019-09-28
    相关资源
    最近更新 更多