curl命令和节点请求之间的对应关系

时间:2015-07-08 12:40:08

标签: node.js curl http-post node-request

如何使用节点的请求包正确返回正确返回预期值的cURL shell命令curl --data "{\"obj\" : \"1234556\"}" --digest "https://USERNAME:PASSWORD@www.someurl.com/rest-api/v0/objectpost"? 我试过这些帖子选项但没有成功:

var request = require('request');
var body = {"obj" : "1234556"};
var post_options = {
    url: url,
    method: 'POST',
    auth: {
        'user': 'USERNAME',
        'pass': 'PASSWORD',
        'sendImmediately': false
    },
    headers: {
        'Content-Type': 'text/json',
        'Content-Length': JSON.stringify(body).length,
        'Accept': "text/json",
        'Cache-Control': "no-cache",
        'Pragma': "no-cache"
    },
    timeout: 4500000,
    body: JSON.stringify(body)
}
request(post_options, callback);

这样就不会对身体进行解析(得到missing required parameter: "obj"之类的东西),而我无法理解它是编码问题还是只是将它传递到错误的地方(即不应该是身体)。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

默认情况下,cURL会发送Content-Type: application/x-www-form-urlencoded,除非您对字段使用-F(将其更改为Content-Type: multipart/form-data)或显式覆盖标题(例如-H 'Content-Type: application/json') 。但是,您的cURL示例发送的数据似乎是JSON。因此服务器会感到困惑,并且无法正确找到它所期望的数据。

所以解决方案是两个选项之一:

  1. 在代码中使用application/json作为Content-Type而不是text/json

  2. 使用form属性实际使用urlencoded格式化数据而不是JSON。 request将获取form个对象并为您执行所有转换和标题设置等。例如:

    var post_options = {
      url: url,
      method: 'POST',
      auth: {
        user: 'USERNAME',
        pass: 'PASSWORD',
        sendImmediately: false
      },
      timeout: 4500000,
      form: body
    };