Estoy intentando realizar una solicitud HTTP POST a la API de Google QPX Express [1] utilizando nodejs y la solicitud [2].
Mi código se ve como sigue:
// 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)
}
})
Lo que estoy tratando de hacer es pasar el JSON usando el argumento multiparte [3]. Pero en lugar de la respuesta JSON adecuada, recibí un error (400 indefinido).
Cuando hago una solicitud usando el mismo JSON y API Key usando CURL en su lugar, funciona bien. Entonces, no hay nada de malo con mi clave API o JSON.
¿Qué pasa con mi código?
EDITAR :
ejemplo de CURL de trabajo:
i) Guardé el JSON que pasaría a mi solicitud en un archivo llamado "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) luego, en la terminal cambié al directorio en el que se ubicó y ejecutó el archivo request.json recién creado (myApiKey significa mi clave API real obviamente):
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 cliente de solicitud http diseñado para nodejs: https://www.npmjs.org/package/request [3] aquí hay un ejemplo que encontré https://www.npmjs.org/package/request#multipart-related [4] La API de QPX Express devuelve un error de análisis 400
Respuestas:
Creo que lo siguiente debería funcionar:
En este caso, el
Content-type: application/json
encabezado se agrega automáticamente.fuente
SyntaxError: Unexpected token "<br> at parse (/home/malcolm/complice/node_modules/body-parser/lib/types/json.js:83:15)
con el primer método.[ERR_STREAM_WRITE_AFTER_END]: write after end
¿cómo puedo solucionarlo?Trabajé en esto durante demasiado tiempo. La respuesta que me ayudó fue: enviar Content-Type: application / json post con node.js
Que usa el siguiente formato:
fuente
No desea varias partes, sino una solicitud POST "simple" (con
Content-Type: application/json
) en su lugar. Aquí tienes todo lo que necesitas:fuente
json: true
tantoJSON.stringify()
body
comoJSON.parse()
la respuesta.request('xxx',{ json: true, body: req.body }).pipe(res).on('error', catchErr);
[ERR_STREAM_WRITE_AFTER_END]: write after end
¿cómo puedo solucionarlo?Ahora, con la nueva versión de JavaScript (ECMAScript 6 http://es6-features.org/#ClassDefinition ) hay una mejor manera de enviar solicitudes utilizando nodejs y la solicitud de Promise ( http://www.wintellect.com/devcenter/nstieglitz/5 -grandes-funciones-en-es6-harmonia )
Usando la biblioteca: https://github.com/request/request-promise
cliente:
servidor:
fuente
Ejemplo.
Como
json: true
opción de inserción , establece el cuerpo en la representación JSON del valor y agrega el"Content-type": "application/json"
encabezado. Además, analiza el cuerpo de la respuesta como JSON. ENLACEfuente
Según doc: https://github.com/request/request
El ejemplo es:
Creo que envías un objeto donde se espera una cadena, reemplaza
por
fuente
fuente
siento
Definir así será la forma efectiva de escribir su código. Y la aplicación / json debería agregarse automáticamente. No es necesario declararlo específicamente.
fuente
puede pasar el objeto json como el cuerpo (tercer argumento) de la solicitud de recuperación.
fuente