request.post继续覆盖内容类型作为content-type:application / x-www-form-urlencoded当指定表单数据时

时间:2015-03-16 19:25:30

标签: node.js post request form-data

我们有一个客户端api调用,需要将一个帖子作为表单数据发送。当我们通过Chrome的Postman扩展程序运行调用时,它会在我们指定表单数据时成功运行,如果我们指定x-www-form-urlencoded,则会返回错误。这是预期的。

然而,尝试使用"请求"在node.js中运行时npm包处理帖子我们继续收到来自api的错误消息,遗憾的是没有给出具体的错误信息。但我们确实看到请求标头对象在出现时看起来像这样:

  

_header:' POST / api / client / coupon / add HTTP / 1.1 \ r \ n授权:基本[auth string redacted] \ r \ nhost:   beta1.client.com \ r \ ncontent型:   应用程序/ x-WWW窗体-urlencoded \ r \ ncontent长度:   172 \ r \ nConnection:keep-alive \ r \ n \ r \ n',

我们的Node.js代码如下:

  //Create the coupon
  var coupon = { code: "abcde1234"),
    discount: "33",
    type: "percent"
  }

  var request = require('request');
  request.post(
    {
      url: "https://beta1.client.com/api/coupon/add",
      headers: {
        "authorization": auth,
        "content-disposition": "form-data; name='data'"
      },
      form: coupon
    },

    function (error, response, body) {
      if (!error && response.statusCode == 200) {
        console.log(body)
      }
    }
  );

我想知道为什么内容类型标题继续阅读" application / x-www-form-urlencoded"当我们提供“表格 - 数据”的内容处理时。对我来说,似乎我可以删除它应该工作的content-type头属性 - 但是如何做到这一点?

任何见解都将不胜感激。

1 个答案:

答案 0 :(得分:1)

最后,我们使用了这里找到的表单数据包:https://www.npmjs.com/package/form-data

我们的代码现在看起来像这样:

    //create coupon json and stringify it
    var coupon = {
      coupon: {
        code: couponCode,
        discount: discountPercentage,
        type: 'percent',
        product: productId,
        times: 1,
        expires: couponExpiresDt
      }
    };
    var couponString = JSON.stringify(coupon);

    //create form-data object to be posted to client api
    var FormData = require('form-data');
    var couponForm = new FormData();
    couponForm.append('data', couponString);

    //create submission options for the post
    var submitOptions = {
      hostname:config.client_api_host,
      path:'/api/2/coupon/add',
      auth:auth,
      protocol:'https:'
    };

    //submit the coupon/add post request
    couponForm.submit(submitOptions, function(err, res) {
      res.resume();

      if (err) {
        callback(err);
      } else if (res.statusCode != 200) {
        callback(new Error('API createDiscount post response error:', res.statusCode));
      } else {
        logger.log('info', "coupon code " + couponCode +  " has apparently been created");
        callback(null, {coupon_code: couponCode, expires: couponExpiresDt});
      }
    });