Estoy leyendo los documentos en http://nodejs.org/docs/v0.4.0/api/http.html#http.request , pero por alguna razón, parece que no puedo encontrar el atributo body / data en el objeto de respuesta devuelto, terminado.
> var res = http.get({host:'www.somesite.com', path:'/'})
> res.finished
true
> res._hasBody
true
Está terminado (http.get lo hace por usted), por lo que debería tener algún tipo de contenido. Pero no hay cuerpo, ni datos, y no puedo leerlo. ¿Dónde se esconde el cuerpo?
data
se realizan los eventos ...res
escuche"end"
( nodejs.org/docs/latest/api/http.html#event_end_ )Respuestas:
http.request docs contiene ejemplos de cómo recibir el cuerpo de la respuesta a través del
data
evento de manejo :http.get hace lo mismo que http.request excepto que llama
req.end()
automáticamente.fuente
res.setEncoding('utf8');
al ejemplo http.get. De lo contrario, no obtuve HTML en lachunk
variable.POST requests typically use a response body, not GET.
publicación tiene un cuerpo y la solicitud GET no, pero una respuesta GET puede tener un cuerpo.También quiero agregar que el
http.ClientResponse
devuelto porhttp.get()
tiene unend
evento, así que aquí hay otra forma en que recibo la respuesta del cuerpo:fuente
http.ClientResponse
no es devuelto porhttp.get()
http.ClientRequest
es, de acuerdo con la documentación actual y la documentación vinculada al póster original.Editar: respondiendo a mí mismo 6 años después
La palabra clave esperar es la mejor manera de obtener una respuesta de una solicitud HTTP, evitando devoluciones de llamada y
.then()
También deberá usar un cliente HTTP que devuelva Promesas.
http.get()
todavía devuelve un objeto Solicitud, por lo que no funcionará. Podría usarfetch
, perosuperagent
es un cliente HTTP maduro que presenta valores predeterminados más razonables, incluida una codificación de cadena de consulta más simple, que usa correctamente los tipos mime, JSON de forma predeterminada y otras características comunes del cliente HTTP.await
esperará hasta que Promise tenga un valor, en este caso, ¡una respuesta HTTP!Usando esperar, el control simplemente pasa a la siguiente línea una vez que la promesa devuelta
superagent.get()
tiene un valor.fuente
res
se establece en el valor de retorno desuperagent.get()
, nohttp.get()
.http.get()
devuelve unhttp.IncomingMessage
que no tiene unatext
propiedad. No es el objeto de respuesta, es el objeto de solicitud.El
data
evento se dispara varias veces con 'fragmentos' del cuerpo a medida que se descargan y unend
evento cuando todos los fragmentos se han descargado.Ahora que Node admite Promesas , creé un contenedor simple para devolver los fragmentos concatenados a través de una Promesa:
Puede llamarlo desde una función asíncrona con:
fuente
Si quieres usar .get puedes hacerlo así
fuente
chunk.toString()
, opcionalmente pasandotoString
y codificando. Dicho esto,setEncoding
es probable que sea más eficiente.Debe agregar un escucha a la solicitud porque node.js funciona de forma asíncrona de esa manera:
fuente
El módulo de aguja también es bueno, aquí hay un ejemplo que usa el
needle
módulofuente
Una porción de café aquí:
Y compilado
fuente
No puede obtener el cuerpo de la respuesta a partir del valor de retorno de
http.get()
.http.get()
no devuelve un objeto de respuesta. Devuelve el objeto de solicitud (http.clientRequest
). Por lo tanto, no hay forma de obtener el cuerpo de la respuesta a partir del valor de retorno dehttp.get()
.Sé que es una pregunta antigua, pero leer la documentación que vinculaste muestra que este era el caso incluso cuando la publicaste.
fuente