NodeJS:请求库 - 使用 userQueryString 的正确方法是什么?
NodeJS: Request Library - What is the Proper way to use userQueryString?
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 时可以完成,但我似乎无法弄清楚 where/how 传递查询字符串以便正确处理它以及在什么格式内进行处理。
例如我在以下代码中为查询字符串尝试了许多不同的地方:
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);
当我在选项 "querystring" 中传递查询字符串时,它会忽略它(也就是,这似乎是错误的地方)。当我把它放在 "qs" 的 "normal" 位置时;我最终将 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"
使用 useQuerystring 设置为 true 时传递查询字符串的正确方法是什么?
根据以下文件,它似乎没有更改查询字符串的位置,所以我认为它是 qs;但如上所述,这是行不通的:
https://github.com/request/request/blob/master/lib/querystring.js
感谢您的帮助!
您需要将查询字符串作为键值对对象传递。我刚刚测试过它有效。
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)
})
文档中的措辞有点误导。
当它说使用 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
因为请求试图转义 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
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 时可以完成,但我似乎无法弄清楚 where/how 传递查询字符串以便正确处理它以及在什么格式内进行处理。
例如我在以下代码中为查询字符串尝试了许多不同的地方:
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);
当我在选项 "querystring" 中传递查询字符串时,它会忽略它(也就是,这似乎是错误的地方)。当我把它放在 "qs" 的 "normal" 位置时;我最终将 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"
使用 useQuerystring 设置为 true 时传递查询字符串的正确方法是什么?
根据以下文件,它似乎没有更改查询字符串的位置,所以我认为它是 qs;但如上所述,这是行不通的: https://github.com/request/request/blob/master/lib/querystring.js
感谢您的帮助!
您需要将查询字符串作为键值对对象传递。我刚刚测试过它有效。
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)
})
文档中的措辞有点误导。
当它说使用 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
因为请求试图转义 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