Czytam dokumenty na stronie http://nodejs.org/docs/v0.4.0/api/http.html#http.request , ale z jakiegoś powodu nie mogę znaleźć atrybutu body / data na zwróconym, gotowym obiekcie odpowiedzi.
> var res = http.get({host:'www.somesite.com', path:'/'})
> res.finished
true
> res._hasBody
true
Jest zakończony (http.get robi to za Ciebie), więc powinien mieć jakąś treść. Ale nie ma ciała, żadnych danych i nie mogę z nich odczytać. Gdzie ukrywa się ciało?
data
wydarzenia się skończą ... poprośres
o"end"
( nodejs.org/docs/latest/api/http.html#event_end_ )Odpowiedzi:
Dokumenty http.request zawierają przykład otrzymywania treści odpowiedzi poprzez obsługę
data
zdarzenia:http.get robi to samo co http.request, tyle że wywołuje
req.end()
automatycznie.źródło
res.setEncoding('utf8');
do przykładu http.get. W przeciwnym razie nie dostałem HTML wchunk
zmiennej.POST requests typically use a response body, not GET.
post żądanie mieć ciało i GET żądania nie robi, ale GET odpowiedź może mieć ciało.Chcę również dodać, że
http.ClientResponse
zwrócone przezhttp.get()
maend
zdarzenie, więc oto inny sposób, w jaki otrzymuję odpowiedź ciała:źródło
http.ClientResponse
nie jest zwracany przezhttp.get()
http.ClientRequest
jest, zarówno zgodnie z aktualną dokumentacją, jak i dokumentacją powiązaną z oryginalnym plakatem.Edycja: odpowiadanie sobie 6 lat później
Oczekujcie słów kluczowych jest najlepszym sposobem, aby uzyskać odpowiedź od żądania HTTP, unikając wywołania zwrotne i
.then()
Musisz także użyć klienta HTTP, który zwraca Obietnice.
http.get()
nadal zwraca obiekt Request, więc to nie zadziała. Możesz użyćfetch
, alesuperagent
jest dojrzałym klientem HTTP, który ma bardziej rozsądne ustawienia domyślne, w tym prostsze kodowanie ciągu zapytania, odpowiednio wykorzystując typy MIME, domyślnie JSON i inne typowe funkcje klienta HTTP.await
poczeka, aż obietnica będzie miała wartość - w tym przypadku odpowiedź HTTP!Używając funkcji czekaj, kontrola po prostu przechodzi do następnego wiersza, gdy zwrócona przez nią obietnica
superagent.get()
ma wartość.źródło
res
ustawiono wartość zwracanąsuperagent.get()
, a niehttp.get()
.http.get()
zwraca wartośćhttp.IncomingMessage
, która nie matext
właściwości. To nie jest obiekt odpowiedzi, to obiekt żądania.data
Zdarzenie jest opalane wiele razy „kawałkami” ciała, ponieważ są one pobierane i wend
przypadku, gdy wszystkie kawałki zostały pobrane.Teraz, gdy węzeł obsługuje obietnice , utworzyłem proste opakowanie, aby zwrócić połączone fragmenty za pomocą obietnicy:
Możesz go wywołać z funkcji asynchronicznej za pomocą:
źródło
Jeśli chcesz użyć .get, możesz to zrobić w ten sposób
źródło
chunk.toString()
, opcjonalnie przekazująctoString
i kodując. To powiedziawszy,setEncoding
jest prawdopodobnie bardziej wydajne.Musisz dodać detektor do żądania, ponieważ node.js działa tak asynchronicznie:
źródło
Moduł igły jest również dobry, oto przykład, który używa
needle
modułuźródło
Porcja kawy tutaj:
I skompilowane
źródło
Nie można uzyskać treści odpowiedzi na podstawie wartości zwracanej
http.get()
.http.get()
nie zwraca obiektu odpowiedzi. Zwraca obiekt żądania (http.clientRequest
). Zatem nie ma żadnego sposobu na uzyskanie treści odpowiedzi na podstawie wartości zwracanejhttp.get()
.Wiem, że to stare pytanie, ale lektura dokumentacji, do której linkujesz, pokazuje, że miało to miejsce nawet po opublikowaniu.
źródło