使用request模块在Node.js中发送URL编码的参数

8

我正在尝试使用request模块通过Pastebin API创建新的粘贴,代码如下:

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对,并包含在请求体中。(参考: How are parameters sent in an HTTP POST request?)

然而,我从PasteBin那里收到了一个Bad API request, invalid api_option的错误信息。所以我用curl在终端中发送了请求,如下所示:

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"  

这样做是有效的。

因此,这引出了两个问题:

  1. 当进行POST请求并提供qs时,参数是如何发送的?
  2. 如何仅使用request模块发送URL编码的请求体?
2个回答

12

在对象中将qs键重命名为formqs键用于指定URL末尾的查询字符串(例如,对于GET请求)。 form键用于指定表单URL编码请求主体(例如,对于POST请求)。


我得出结论(即 POST + qs = url-encoded body),是因为在使用 POST 请求时,有些 API(声称需要 url-encoded body)如果我使用 qs 而不是 form,则可以正常工作。对此有何见解?(: - An SO User
2
@LittleChild 我的最佳猜测是这些API正在执行类似于 body = req.body || req.query 的操作,或者类似于此类的操作。这意味着它将在请求的正文或查询字符串中查找POST数据。 - idbehold
请纠正我,POST 用于发送不应作为 URL 的一部分发送的敏感数据。因此,允许将数据作为查询字符串发送的 API(同时在文档中提到编码的请求体)正在向所有人公开数据? - An SO User
2
@LittleChild 只要你将请求发送到 HTTPS 端点,就应该没问题。在发送 path 标头之前(其中包含查询字符串),会先建立与 SSL 端点的连接。请参见此处:https://dev59.com/I3RC5IYBdhLWcg3wW_tk#323286 - idbehold
非常感谢,伙计!SO问题的链接回答了我心中另一个问题。 - An SO User

3

我也遇到了同样的问题,我的解决方案完美地解决了这个问题。

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){  ...});  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接