read example body json node.js curl express node-request

example - pasar JSON a la solicitud HTTP POST



read json django (8)

Ahora con la nueva versión de JavaScript (ECMAScript 6 http://es6-features.org/#ClassDefinition ) hay una mejor manera de enviar solicitudes usando nodejs y Promise request ( http://www.wintellect.com/devcenter/nstieglitz/5-great-features-in-es6-harmony )

Usando la biblioteca: https://github.com/request/request-promise

npm install --save request npm install --save request-promise

cliente:

//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... });

servidor:

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);

Estoy tratando de hacer una solicitud HTTP POST a la API Google QPX Express [1] usando nodejs y request [2].

Mi código se ve de la siguiente manera:

// 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 intento hacer es pasar el JSON usando el argumento multiparte [3]. Pero en lugar de la respuesta JSON adecuada, recibí un error (400 indefinidos).

Cuando realizo una solicitud usando la misma clave JSON y API usando CURL, funciona bien. Entonces no hay nada de malo con mi clave API o JSON.

¿Qué tiene de malo mi código?

EDITAR :

ejemplo 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 el terminal, cambié al directorio en el que se encontraba y ejecutó el archivo request.json recién creado (myApiKey representa 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] QPX Express API está devolviendo un error de análisis 400


Creo que lo siguiente debería funcionar:

// fire request request({ url: url, method: "POST", json: requestData }, ...

En este caso, se agrega automáticamente el encabezado Content-type: application/json .


Ejemplo.

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); });

Al insertar la opción json: true , establece el cuerpo en la representación de valor JSON y agrega "Content-type": "application/json" encabezado "Content-type": "application/json" . Además, analiza el cuerpo de respuesta como JSON. LINK


No desea multiparte, sino una solicitud POST "simple" (con Content-Type: application/json ) en su lugar. Aquí está todo lo que necesitas:

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 });


Según el documento: https://github.com/request/request

El ejemplo es:

multipart: { chunked: false, data: [ { ''content-type'': ''application/json'', body: JSON.stringify({foo: ''bar'', _attachments: {''message.txt'': {follows: true, length: 18, ''content_type'': ''text/plain'' }}}) }, ] }

Creo que envía un objeto donde se espera una cadena, reemplace

body: requestData

por

body: JSON.stringify(requestData)


Trabajé en esto por mucho tiempo. La respuesta que me ayudó fue: enviar Content-Type: application / json post con node.js

Que utiliza el siguiente formato:

request({ url: url, method: "POST", headers: { "content-type": "application/json", }, json: requestData // body: JSON.stringify(requestData) }, function (error, resp, body) { ...


siento

var x = request.post({ uri: config.uri, json: reqData });

Definir así será la forma efectiva de escribir su código. Y la aplicación / json debe agregarse automáticamente. No hay necesidad de declararlo específicamente.


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); });