req nodejs node headers body javascript node.js http-post

javascript - nodejs - Cómo publicar en una solicitud usando node.js



req.body node js (8)

El problema es que estás configurando Content-Type en el lugar equivocado. Es parte de los encabezados de solicitud, que tienen su propia clave en el objeto de opciones, el primer parámetro del método request (). Aquí hay una implementación que utiliza ClientRequest () para una transacción única (puede mantener createClient () si necesita realizar varias conexiones al mismo servidor):

var http = require(''http'') var body = JSON.stringify({ foo: "bar" }) var request = new http.ClientRequest({ hostname: "SERVER_NAME", port: 80, path: "/get_stuff", method: "POST", headers: { "Content-Type": "application/json", "Content-Length": Buffer.byteLength(body) } }) request.end(body)

El resto del código en la pregunta es correcto (request.on () y más abajo).

Estoy tratando de publicar algunos json en una URL. Vi varias otras preguntas sobre esto en el stackoverflow pero ninguna de ellas parecía ser clara o correcta. Esto es lo que llegué, modifiqué el ejemplo en los documentos api:

var http = require(''http''); var google = http.createClient(80, ''server''); var request = google.request(''POST'', ''/get_stuff'', {''host'': ''sever'', ''content-type'': ''application/json''}); request.write(JSON.stringify(some_json),encoding=''utf8''); //possibly need to escape as well? request.end(); request.on(''response'', function (response) { console.log(''STATUS: '' + response.statusCode); console.log(''HEADERS: '' + JSON.stringify(response.headers)); response.setEncoding(''utf8''); response.on(''data'', function (chunk) { console.log(''BODY: '' + chunk); }); });

Cuando publico esto en el servidor, recibo un error que me dice que no es del formato json o que no es utf8, como deberían ser. Intenté sacar la url de solicitud pero es nula. Estoy empezando con nodejs, así que por favor sea amable.


Es posible que esto no resuelva su problema, pero javascript no admite argumentos con nombre, por lo que donde dice:

request.write(JSON.stringify(some_json),encoding=''utf8'');

Deberías estar diciendo:

request.write(JSON.stringify(some_json),''utf8'');

La codificación = se está asignando a una variable global, por lo que es una sintaxis válida pero probablemente no hace lo que se pretende.


Hay una biblioteca muy buena que admite el envío de solicitudes POST en Nodejs:

Enlace: https://github.com/mikeal/request

Código de muestra:

var request = require(''request''); //test data var USER_DATA = { "email": "[email protected]", "password": "a075d17f3d453073853f813838c15b8023b8c487038436354fe599c3942e1f95" } var options = { method: ''POST'', url: ''URL:PORT/PATH'', headers: { ''Content-Type'': ''application/json'' }, json: USER_DATA }; function callback(error, response, body) { if (!error) { var info = JSON.parse(JSON.stringify(body)); console.log(info); } else { console.log(''Error happened: ''+ error); } } //send request request(options, callback);


Intenta incluir la longitud del contenido.

var body = JSON.stringify(some_json); var request = google.request(''POST'', ''/get_stuff'', { host: ''server'', ''Content-Length'': Buffer.byteLength(body), ''Content-Type'': ''application/json'' }); request.write(body); request.end();


Jammus lo entendió bien. Si el encabezado Content-Length no está establecido, entonces el cuerpo contendrá algún tipo de longitud al inicio y un 0 al final.

Así que cuando estaba enviando desde Nodo:

{"email":"[email protected]","passwd":"123456"}

mi servidor de rieles estaba recibiendo:

"2b {"email":"[email protected]","passwd":"123456"} 0 "

Rails no entendió el 2b, por lo que no interpretaría los resultados.

Por lo tanto, para pasar parámetros a través de JSON, establezca Content-Type en application / json y proporcione siempre Content-Length.


Para enviar JSON como POST a una API externa con NodeJS ... (y módulo "http")

var http = require(''http''); var post_req = null, post_data = ''{"login":"toto","password":"okay","duration":"9999"}''; var post_options = { hostname: ''192.168.1.1'', port : ''8080'', path : ''/web/authenticate'', method : ''POST'', headers : { ''Content-Type'': ''application/json'', ''Cache-Control'': ''no-cache'', ''Content-Length'': post_data.length } }; post_req = http.request(post_options, function (res) { console.log(''STATUS: '' + res.statusCode); console.log(''HEADERS: '' + JSON.stringify(res.headers)); res.setEncoding(''utf8''); res.on(''data'', function (chunk) { console.log(''Response: '', chunk); }); }); post_req.on(''error'', function(e) { console.log(''problem with request: '' + e.message); }); post_req.write(post_data); post_req.end();


Probablemente no existía en el momento en que se hizo esta pregunta, podría utilizar hoy en día una biblioteca de nivel superior para manejar las solicitudes de http, como https://github.com/mikeal/request . El módulo http incorporado de Node es un nivel demasiado bajo para que comiencen los principiantes.

El módulo de solicitud de Mikeal tiene soporte incorporado para el manejo directo de JSON (consulte la documentación, especialmente https://github.com/mikeal/request#requestoptions-callback ).


var request = google.request( ''POST'', ''/get_stuff'', { ''host'': ''sever'', **''headers''**: { ''content-type'': ''application/json'' } } );