Saya mencoba membuat permintaan HTTP POST ke Google QPX Express API [1] menggunakan nodejs dan request [2].
Kode saya terlihat sebagai berikut:
// 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)
}
})
Apa yang saya coba lakukan adalah meneruskan JSON menggunakan argumen multi bagian [3]. Tetapi alih-alih respons JSON yang tepat, saya mendapat kesalahan (400 tidak ditentukan).
Saat saya membuat permintaan menggunakan JSON dan API Key yang sama menggunakan CURL, ini berfungsi dengan baik. Jadi tidak ada yang salah dengan kunci API atau JSON saya.
Apa yang salah dengan kode saya?
EDIT :
contoh CURL bekerja:
i) Saya menyimpan JSON yang akan saya berikan ke permintaan saya ke dalam file bernama "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) kemudian, di terminal saya beralih ke direktori tempat file request.json yang baru dibuat berada dan dijalankan (myApiKey jelas merupakan singkatan dari API Key saya yang sebenarnya):
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] klien permintaan http yang dirancang untuk nodejs: https://www.npmjs.org/package/request [3] berikut adalah contoh yang saya temukan https://www.npmjs.org/package/request#multipart-related [4] QPX Express API menampilkan kesalahan 400 parse
Jawaban:
Saya pikir yang berikut seharusnya berhasil:
// fire request request({ url: url, method: "POST", json: requestData }, ...
Dalam hal ini,
Content-type: application/json
tajuk ditambahkan secara otomatis.sumber
SyntaxError: Unexpected token "<br> at parse (/home/malcolm/complice/node_modules/body-parser/lib/types/json.js:83:15)
dengan metode pertama.[ERR_STREAM_WRITE_AFTER_END]: write after end
bagaimana cara memperbaikinya?Saya mengerjakan ini terlalu lama. Jawaban yang membantu saya ada di: send Content-Type: application / json post with node.js
Yang menggunakan format berikut:
request({ url: url, method: "POST", headers: { "content-type": "application/json", }, json: requestData // body: JSON.stringify(requestData) }, function (error, resp, body) { ...
sumber
Anda tidak menginginkan multibagian, tetapi permintaan POST "biasa" (dengan
Content-Type: application/json
) sebagai gantinya. Inilah yang Anda butuhkan: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 });
sumber
json: true
harus keduanyaJSON.stringify()
body
danJSON.parse()
tanggapannya.request('xxx',{ json: true, body: req.body }).pipe(res).on('error', catchErr);
[ERR_STREAM_WRITE_AFTER_END]: write after end
bagaimana cara memperbaikinya?Sekarang dengan versi JavaScript baru (ECMAScript 6 http://es6-features.org/#ClassDefinition ) ada cara yang lebih baik untuk mengirimkan permintaan menggunakan nodejs dan permintaan Promise ( http://www.wintellect.com/devcenter/nstieglitz/5 -fitur-hebat-dalam-es6-harmoni )
Menggunakan perpustakaan: https://github.com/request/request-promise
klien:
//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... });
server:
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);
sumber
Contoh.
var request = require('request'); var url = "http://localhost:3000"; var requestData = { ... } var data = { url: url, json: true, body: JSON.stringify(requestData) } request.post(data, function(error, httpResponse, body){ console.log(body); });
Sebagai
json: true
opsi penyisipan , setel isi ke representasi nilai JSON dan tambahkan"Content-type": "application/json"
header. Selain itu, parsing isi respons sebagai JSON. TAUTANsumber
Menurut dok: https://github.com/request/request
Contohnya adalah:
multipart: { chunked: false, data: [ { 'content-type': 'application/json', body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) }, ] }
Saya pikir Anda mengirim objek di mana string diharapkan, ganti
oleh
body: JSON.stringify(requestData)
sumber
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); });
sumber
saya rasa
var x = request.post({ uri: config.uri, json: reqData });
Mendefinisikan seperti ini akan menjadi cara efektif untuk menulis kode Anda. Dan application / json akan ditambahkan secara otomatis. Tidak perlu secara khusus mendeklarasikannya.
sumber
Anda bisa meneruskan objek json sebagai badan (argumen ketiga) dari permintaan pengambilan.
sumber