使用请求模块在 Node.js 中发送 URL 编码的参数
Posted
技术标签:
【中文标题】使用请求模块在 Node.js 中发送 URL 编码的参数【英文标题】:Send URL-encoded parameters in Node.js using request module 【发布时间】:2015-10-17 23:04:44 【问题描述】:我正在尝试 create a new paste using the PasteBin API 和 request
模块,如下所示:
var request = require("request");
request(
url : "http://pastebin.com/api/api_post.php",
method : "POST",
qs :
"api_dev_key" : MY_DEV_KEY,
"api_option" : "paste",
"api_paste_code" : "random text"
,function(err,res,body)
...
);
我的理解是,由于方法是POST
,并且提供了查询字符串参数,所以qs
对象中的值将作为key=value
对存储在body中。 (参考:How are parameters sent in an HTTP POST request?)
但是,我从 PasteBin 收到了 Bad API request, invalid api_option
。所以我curl
ed 来自我的终端的请求,如下所示:
curl -X POST "http://pastebin.com/api/api_post.php" -d "api_dev_key=[MY_DEV_KEY]&api_option=paste&api_paste_code=some+random+text"
这很有效。
所以这就引出了两个问题:
-
在发出
POST
请求并提供qs
时,究竟如何发送参数?
如何仅使用 request
模块发送 URL 编码的正文?
【问题讨论】:
【参考方案1】:将对象中的qs
键重命名为form
。 qs
键用于指定 URL 末尾的查询字符串(例如,对于 GET 请求)。 form
键用于指定表单 URL 编码的请求正文(例如,对于 POST 请求)。
【讨论】:
我得出了我的结论(POST
+ qs
= url-encoded body),因为如果我使用 qs
,某些 API(即他们想要一个 url-encoded body)可以正常工作而不是form
发出POST
请求。对此有任何见解吗? (:
@LittleChild 我最好的猜测是这些 API 正在做类似body = req.body || req.query
或类似的事情。这意味着它将在请求正文或查询字符串中查找 POST 数据。
如果我错了,请纠正我,POST
用于发送不应作为 URL 的一部分发送的敏感数据。因此,允许数据作为查询字符串发送的 API(同时在文档中提到了 url 编码的正文)正在公开数据供所有人查看?
@LittleChild 只要您将请求发送到 HTTPS 端点就可以了。在发送path
标头(将包含查询字符串)之前建立与 SSL 端点的连接。见这里:***.com/a/323286/1397319
非常感谢,伙计! SO问题的链接回答了我想到的另一个问题。【参考方案2】:
对我来说同样的问题和对我来说完美的解决方案是。
request.post(
headers:
'Content-Type': 'application/x-www-form-urlencoded'
,
url : "http://pastebin.com/api/api_post.php",
body : "api_dev_key=MY_DEV_KEY&api_option=paste&api_paste_code=andom text",function(err,res,body) ...);
【讨论】:
以上是关于使用请求模块在 Node.js 中发送 URL 编码的参数的主要内容,如果未能解决你的问题,请参考以下文章
Node.js:登录后在 URL 中发送带有令牌(JWT)的新请求