Отправить параметры в кодировке URL в Node.js с помощью модуля запроса

Я пытаюсь создать новую вставку с помощью 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 в теле. (Ссылка: Как параметры отправляются в запросе HTTP POST?< /а>)

Однако я получаю Bad API request, invalid api_option из PasteBin. Итак, я 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. Как отправить тело в кодировке URL, используя только модуль request?

person An SO User    schedule 27.07.2015    source источник


Ответы (2)


Переименуйте ключ qs в form в объекте. Ключ qs предназначен для указания строки запроса в конце URL-адреса (например, для запросов GET). Ключ form предназначен для указания тела запроса в форме URL-адреса (например, для запроса POST).

person idbehold    schedule 27.07.2015
comment
Я пришел к выводу (что POST + qs = тело с кодировкой URL), потому что некоторые API (которые заявляют, что им нужно тело с кодировкой URL) работают нормально, если я использую qs вместо form при выполнении запроса POST. Любое понимание этого? (: - person An SO User; 27.07.2015
comment
@LittleChild, я думаю, эти API делают что-то вроде body = req.body || req.query или что-то в этом роде. Это означает, что он будет искать данные POST либо в теле запроса, либо в строке запроса. - person idbehold; 27.07.2015
comment
Поправьте меня, если я ошибаюсь, POST используется для отправки конфиденциальных данных, которые не должны отправляться как часть URL-адреса. Таким образом, API, которые позволяют отправлять данные в виде строки запроса (хотя в документации упоминается тело в кодировке URL), предоставляют данные для всеобщего обозрения? - person An SO User; 27.07.2015
comment
@LittleChild, пока вы отправляете запрос на конечную точку HTTPS, все должно быть в порядке. Соединение с конечной точкой SSL устанавливается до отправки заголовка path (который будет содержать строку запроса). См. здесь: stackoverflow.com/a/323286/1397319 - person idbehold; 27.07.2015
comment
Большое спасибо, приятель! Ссылка на вопрос SO ответила на другой вопрос, который я имел в виду. - person An SO User; 27.07.2015

та же проблема для меня, и мое решение, которое отлично работает для меня.

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){  ...});  
person noodlesegg    schedule 05.04.2019