Je lis la documentation sur http://nodejs.org/docs/v0.4.0/api/http.html#http.request , mais pour une raison quelconque, je n'arrive pas à trouver l'attribut body / data sur l'objet de réponse renvoyé et terminé.
> var res = http.get({host:'www.somesite.com', path:'/'})
> res.finished
true
> res._hasBody
true
C'est fini (http.get le fait pour vous), donc il devrait avoir une sorte de contenu. Mais il n'y a pas de corps, pas de données et je ne peux pas en lire. Où se cache le corps?
data
événements sont terminés ..res
écoutez"end"
( nodejs.org/docs/latest/api/http.html#event_end_ )Réponses:
La documentation http.request contient un exemple de comment recevoir le corps de la réponse via l'
data
événement de gestion :http.get fait la même chose que http.request sauf qu'il appelle
req.end()
automatiquement.la source
res.setEncoding('utf8');
à l'exemple http.get. Sinon, je n'ai pas eu HTML dans lachunk
variable.POST requests typically use a response body, not GET.
La demande de publication a un corps et la demande GET n'en a pas, mais une réponse GET peut avoir un corps.Je veux également ajouter que le
http.ClientResponse
renvoyé parhttp.get()
a unend
événement, voici donc une autre façon de recevoir la réponse du corps:la source
http.ClientResponse
n'est pas retourné parhttp.get()
http.ClientRequest
est, selon à la fois la documentation actuelle et la documentation liée à l'affiche originale.Edit: se répondre 6 ans plus tard
Le mot - clé await est le meilleur moyen d'obtenir une réponse à partir d'une requête HTTP, en évitant les rappels et
.then()
Vous devrez également utiliser un client HTTP qui renvoie des promesses.
http.get()
retourne toujours un objet Request, donc cela ne fonctionnera pas. Vous pouvez utiliserfetch
, maissuperagent
c'est un client HTTP mature qui présente des valeurs par défaut plus raisonnables, notamment un codage de chaîne de requête plus simple, utilisant correctement les types mime, JSON par défaut et d'autres fonctionnalités courantes du client HTTP.await
attendra que la promesse ait une valeur - dans ce cas, une réponse HTTP!En utilisant await, le contrôle passe simplement à la ligne suivante une fois que la promesse renvoyée par
superagent.get()
a une valeur.la source
res
est défini sur la valeur de retour desuperagent.get()
, nonhttp.get()
.http.get()
renvoie unhttp.IncomingMessage
qui n'a pas detext
propriété. Ce n'est pas l'objet de réponse, c'est l'objet de requête.L'
data
événement est déclenché plusieurs fois avec des «morceaux» du corps lorsqu'ils sont téléchargés et unend
événement lorsque tous les morceaux ont été téléchargés.Avec Node prenant en charge les promesses maintenant, j'ai créé un wrapper simple pour renvoyer les morceaux concaténés via une promesse:
Vous pouvez l'appeler depuis une fonction asynchrone avec:
la source
Si vous voulez utiliser .get, vous pouvez le faire comme ceci
la source
chunk.toString()
, éventuellement en passanttoString
et en encodant. Cela dit,setEncoding
est probablement plus efficace.Vous devez ajouter un écouteur à la requête car node.js fonctionne de manière asynchrone comme ça:
la source
Le module d'aiguille est également bon, voici un exemple qui utilise le
needle
modulela source
Une portion de café ici:
Et compilé
la source
Vous ne pouvez pas obtenir le corps de la réponse à partir de la valeur de retour de
http.get()
.http.get()
ne renvoie pas d'objet de réponse. Il renvoie l'objet de requête (http.clientRequest
). Il n'y a donc aucun moyen d'obtenir le corps de la réponse à partir de la valeur de retour dehttp.get()
.Je sais que c'est une vieille question, mais la lecture de la documentation à laquelle vous avez lié montre que c'était le cas même lorsque vous l'avez postée.
la source