将JSON传递给HTTP POST请求
我正在尝试使用nodejs和request [2]向Google QPX Express API [1]发出HTTP POST请求。
我的代码如下所示:
// create http request client to consume the QPX API var request = require("request") // JSON to be passed to the QPX Express API var requestData = { "request": { "slice": [ { "origin": "ZRH", "destination": "DUS", "date": "2014-12-02" } ], "passengers": { "adultCount": 1, "infantInLapCount": 0, "infantInSeatCount": 0, "childCount": 0, "seniorCount": 0 }, "solutions": 2, "refundable": false } } // QPX REST API URL (I censored my api key) url = "https://www.googleapis.com/qpxExpress/v1/trips/search?key=myApiKey" // fire request request({ url: url, json: true, multipart: { chunked: false, data: [ { 'content-type': 'application/json', body: requestData } ] } }, function (error, response, body) { if (!error && response.statusCode === 200) { console.log(body) } else { console.log("error: " + error) console.log("response.statusCode: " + response.statusCode) console.log("response.statusText: " + response.statusText) } })
我想要做的是使用multipartparameter passingJSON [3]。 但是,而不是正确的JSON响应,我得到了一个错误(400未定义)。
当我使用CURL使用相同的JSON和API密钥进行请求时,它可以正常工作。 所以,我的API密钥或JSON没有任何问题。
我的代码有什么问题?
编辑 :
工作CURL示例:
我)我将我传递给我的请求的JSON保存到一个名为“request.json”的文件中:
{ "request": { "slice": [ { "origin": "ZRH", "destination": "DUS", "date": "2014-12-02" } ], "passengers": { "adultCount": 1, "infantInLapCount": 0, "infantInSeatCount": 0, "childCount": 0, "seniorCount": 0 }, "solutions": 20, "refundable": false } }
ii)然后,在terminal中,我切换到新创build的request.json文件所在的目录并运行(myApiKey显然代表我的实际API密钥):
curl -d @request.json --header "Content-Type: application/json" https://www.googleapis.com/qpxExpress/v1/trips/search?key=myApiKey
[1] https://developers.google.com/qpx-express/ [2]为nodejsdevise的http请求客户端: https ://www.npmjs.org/package/request [3]这里是我find的一个例子https://www.npmjs.org/package/request#multipart-related [4] QPX Express API返回400parsing错误
我认为以下应该工作:
// fire request request({ url: url, method: "POST", json: requestData }, ...
在这种情况下, Content-type: application/json
头被自动添加。
我在这工作了太久。 帮助我的答案是: 发送Content-Type:application / json post与node.js
其中使用以下格式:
request({ url: url, method: "POST", headers: { "content-type": "application/json", }, json: requestData // body: JSON.stringify(requestData) }, function (error, resp, body) { ...
你不需要多部分,而是一个“普通的”POST请求(使用Content-Type: application/json
)。 这是你需要的一切:
var request = require('request'); var requestData = { request: { slice: [ { origin: "ZRH", destination: "DUS", date: "2014-12-02" } ], passengers: { adultCount: 1, infantInLapCount: 0, infantInSeatCount: 0, childCount: 0, seniorCount: 0 }, solutions: 2, refundable: false } }; request('https://www.googleapis.com/qpxExpress/v1/trips/search?key=myApiKey', { json: true, body: requestData }, function(err, res, body) { // `body` is a js object if request was successful });
现在使用新的JavaScript版本(ECMAScript 6 http://es6-features.org/#ClassDefinition ),有一个更好的方法来使用nodejs和Promise请求提交请求( http://www.wintellect.com/devcenter/nstieglitz/5 – 强大的function在es6和谐 )
使用库: https : //github.com/request/request-promise
npm install --save request npm install --save request-promise
客户:
//Sequential execution for node.js using ES6 ECMAScript var rp = require('request-promise'); rp({ method: 'POST', uri: 'http://localhost:3000/', body: { val1 : 1, val2 : 2 }, json: true // Automatically stringifies the body to JSON }).then(function (parsedBody) { console.log(parsedBody); // POST succeeded... }) .catch(function (err) { console.log(parsedBody); // POST failed... });
服务器:
var express = require('express') , bodyParser = require('body-parser'); var app = express(); app.use(bodyParser.json()); app.post('/', function(request, response){ console.log(request.body); // your JSON var jsonRequest = request.body; var jsonResponse = {}; jsonResponse.result = jsonRequest.val1 + jsonRequest.val2; response.send(jsonResponse); }); app.listen(3000);
var request = require('request'); request({ url: "http://localhost:8001/xyz", json: true, headers: { "content-type": "application/json", }, body: JSON.stringify(requestData) }, function(error, response, body) { console.log(response); });
根据文档: https : //github.com/request/request
例子是:
multipart: { chunked: false, data: [ { 'content-type': 'application/json', body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) }, ] }
我认为你发送一个string预期的对象,replace
body: requestData
通过
body: JSON.stringify(requestData)