J'essaye de faire une requête HTTP POST à l'API google QPX Express [1] en utilisant nodejs et request [2].
Mon code ressemble à ceci:
// 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)
}
})
Ce que j'essaie de faire est de passer le JSON en utilisant l'argument multipart [3]. Mais au lieu de la bonne réponse JSON, j'ai eu une erreur (400 indéfini).
Lorsque je fais une demande en utilisant le même JSON et la même clé API en utilisant CURL à la place, cela fonctionne bien. Il n'y a donc rien de mal avec ma clé API ou JSON.
Qu'est ce qui ne va pas avec mon code?
MODIFIER :
exemple de travail CURL:
i) J'ai enregistré le JSON que je passerais à ma requête dans un fichier appelé "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) ensuite, dans le terminal, je suis passé au répertoire dans lequel le fichier request.json nouvellement créé était situé et exécuté (myApiKey représente évidemment ma clé API réelle):
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] un client de requête http conçu pour nodejs: https://www.npmjs.org/package/request [3] voici un exemple que j'ai trouvé https://www.npmjs.org/package/request#multipart-related [4] L'API QPX Express renvoie une erreur d'analyse 400
Réponses:
Je pense que ce qui suit devrait fonctionner:
Dans ce cas, l'en-
Content-type: application/json
tête est automatiquement ajouté.la source
SyntaxError: Unexpected token "<br> at parse (/home/malcolm/complice/node_modules/body-parser/lib/types/json.js:83:15)
avec la première méthode.[ERR_STREAM_WRITE_AFTER_END]: write after end
comment puis-je la corriger?J'ai travaillé trop longtemps dessus. La réponse qui m'a aidé était à: envoyer Content-Type: application / json post avec node.js
Qui utilise le format suivant:
la source
Vous ne voulez pas en plusieurs parties, mais une requête POST "simple" (avec
Content-Type: application/json
) à la place. Voici tout ce dont vous avez besoin:la source
json: true
devrait à la foisJSON.stringify()
body
etJSON.parse()
la réponse.request('xxx',{ json: true, body: req.body }).pipe(res).on('error', catchErr);
[ERR_STREAM_WRITE_AFTER_END]: write after end
comment puis-je la corriger?Désormais, avec la nouvelle version JavaScript (ECMAScript 6 http://es6-features.org/#ClassDefinition ), il existe un meilleur moyen de soumettre des requêtes en utilisant nodejs et Promise request ( http://www.wintellect.com/devcenter/nstieglitz/5 -grandes-fonctionnalités-en-harmonie-es6 )
Utilisation de la bibliothèque: https://github.com/request/request-promise
client:
serveur:
la source
Exemple.
En tant
json: true
qu'option d' insertion , définit le corps sur la représentation JSON de la valeur et ajoute un en-"Content-type": "application/json"
tête. En outre, analyse le corps de la réponse en tant que JSON. LIENla source
Selon doc: https://github.com/request/request
L'exemple est:
Je pense que vous envoyez un objet où une chaîne est attendue, remplacez
par
la source
la source
Je ressens
Une telle définition sera le moyen efficace d'écrire votre code. Et application / json devrait être automatiquement ajouté. Il n'est pas nécessaire de le déclarer spécifiquement.
la source
vous pouvez passer l'objet json comme corps (troisième argument) de la requête d'extraction.
la source