使用请求模块在 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。所以我curled 来自我的终端的请求,如下所示:

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 键重命名为formqs 键用于指定 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创建服务,发送请求后返回数据

Node.js:登录后在 URL 中发送带有令牌(JWT)的新请求

Node.js:get/post请求全局对象工具模块

如何使用 node.js 发送 HTTP/2.0 请求

使用 node.js 发送 Content-Type: application/json post

Node JS请求获取原始url