节点请求模块未将Content-Type设置为application / json

时间:2017-09-20 10:17:44

标签: json node.js http post request

我的NodeJS / Koa.js应用程序遇到一个奇怪的问题,我正在做的HTTP请求返回时出现此错误消息:

{"Message":"The request entity's media type 'application/x-www-form-urlencoded' is not supported for this resource."

现在,当我使用邮递员发出相同的请求时,我得到了正确的结果,所以我推断出我的代码中存在错误。我似乎无法弄明白。这是我的代码来发出请求和有效负载。

 // Content Type
        if(options.contentType === 'json') {
            headers['Content-Type'] = 'application/json';
        }

        // Content Length
        if(options.contentLength) {
            reqHeaders['Content-Length'] = options.contentLength
        }

        if(headers) {
            for(let key in headers) {
                if(!headers.hasOwnProperty(key)) {
                    continue;
                }

                reqHeaders[key] = headers[key];
            }
        }

        const payload = {
            headers : reqHeaders,
            url     : url,
            method  : requestType,
            timeout : 10000,
            form    : vars,
            followRedirect: true,
            maxRedirects: 10,
            body    : '' || options.body
        };

        return new Promise(function(resolve, reject) {
            request(payload, function(error, response, body) {
                if(response) {
                    if(!error && response.statusCode === 200) {
                        resolve(response, body);
                    } else {
                        if(response.statusCode === 401) {
                            console.log('token expired');
                        }
                        reject(response, body);
                    }
                }
            });
        });

有效载荷:

{
  "headers": {
    "Cookie": "XDEBUG_SESSION=PHPSTORM",
    "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkZWdvdWxkLWxvZ2luLmRldiIsImFjY291bnQiOiI1OTY3NmFmZmYyOWE1NWI2MTViOWFiMWEiLCJhdXRoTGV2ZWwiOjAsImlhdCI6MTUwNTg5OTQ3MX0.r-XaeTsQTjSkab9SNjrHgnh6lrgNP0uJCaDIV22A6gM",
    "Content-Type": "application/json"
  },
  "url": "http://54.***.***/api/Report/History",
  "method": "POST",
  "timeout": 10000,
  "form": {
    "AccountId": "59676afff29a55b615b9ab1a",
    "StartDate": "2017-09-19T10:11:47.0266607+00:00",
    "EndDate": "2017-09-19T10:11:47.0266607+00:00",
    "VIN": "SALLAK"
  },
  "followRedirect": true,
  "maxRedirects": 10
}

正如您所看到的,我在头文件对象中有正确的Content-Type标头,它位于我传递给请求函数的有效负载中,但它仍然看起来像是以x-www-form-encoded方式发送。任何人都可以看到这里可能出现的问题吗?

由于

2 个答案:

答案 0 :(得分:5)

docs读取:

  
      
  • form - 当传递一个对象或一个查询字符串时,它将body设置为值的查询字符串表示,并添加Content-type:   application / x-www-form-urlencoded header。
  •   

  
      
  • json - 将body设置为值的JSON表示,并添加Content-type:application / json header。
  •   

您正在使用RxJS,因此会覆盖标题。请尝试使用form。无论如何它都会覆盖你的标题,但价值将是' application / json'哪个应该没问题。

答案 1 :(得分:1)

如果我可以提出几点建议:

  • 您可以使用Object.assign在对象中设置标题。
  • 设置x[1..-1] 将会处理正确的内容类型标题。
  • 您不必手动设置内容长度,这是一件非常棘手的事情。请求处理。
  • 如果要返回承诺,请考虑使用启用了json: true的请求承诺来检查令牌过期。

    fullResponse