Wiem, że kiedyś istniał sposób na uzyskanie tego za pomocą apache commons, jak udokumentowano tutaj: http://hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpMethod.html i przykład tutaj:
http://www.kodejava.org/examples/416.html
ale uważam, że jest to przestarzałe. Czy istnieje inny sposób, aby żądanie HTTP get w java i uzyskać treść odpowiedzi jako ciąg znaków, a nie strumień?
java
apache-httpclient-4.x
apache-commons
Duński94
źródło
źródło
Odpowiedzi:
Każda biblioteka, o której przychodzi mi do głowy, zwraca strumień. Możesz użyć
IOUtils.toString()
z Apache Commons IO do wczytaniaInputStream
doString
wywołania metody w jednym. Na przykład:Aktualizacja: Zmieniłem powyższy przykład, aby użyć kodowania treści z odpowiedzi, jeśli jest dostępne. W przeciwnym razie najlepszym rozwiązaniem będzie domyślny kod UTF-8, zamiast używania domyślnego systemu lokalnego.
źródło
Content-Encoding
nagłówka z odpowiedzi, jeśli jest dostępny.Oto dwa przykłady z mojego projektu roboczego.
Korzystanie
EntityUtils
iHttpEntity
Za pomocą
BasicResponseHandler
źródło
response.getEntity()
i jest teraz dostępny jakoresponseString
. jeśli spróbujesz ponownie wykonać odpowiedź.getEntity (), to zwróciIllegalStateException
.Oto przykład z innego prostego projektu, nad którym pracowałem, używając biblioteki httpclient z Apache:
po prostu użyj EntityUtils, aby pobrać treść odpowiedzi jako String. bardzo prosty.
źródło
Jest to stosunkowo proste w konkretnym przypadku, ale dość trudne w przypadku ogólnym.
Odpowiedź zależy od
Content-Type
nagłówka odpowiedzi HTTP .Ten nagłówek zawiera informacje o ładunku i może definiować kodowanie danych tekstowych. Nawet jeśli przyjmiesz typ tekstu , może być konieczne zbadanie samej treści w celu określenia prawidłowego kodowania znaków. Np. Zobacz specyfikację HTML 4, aby dowiedzieć się, jak to zrobić dla tego konkretnego formatu.
Gdy kodowanie jest znane, do dekodowania danych można użyć InputStreamReader .
Ta odpowiedź zależy od tego, czy serwer postąpi właściwie - jeśli chcesz obsłużyć przypadki, w których nagłówki odpowiedzi nie są zgodne z dokumentem lub deklaracje dokumentu nie pasują do zastosowanego kodowania, to kolejny kocioł ryb.
źródło
Poniżej znajduje się prosty sposób uzyskiwania dostępu do odpowiedzi jako ciągu znaków przy użyciu biblioteki klienta HTTP Apache.
źródło
A co powiesz na to?
źródło
Odpowiedź McDowella jest poprawna. Jeśli jednak spróbujesz innych sugestii w kilku z powyższych postów.
Wtedy otrzymasz wyjątek nielegalnyStateException stwierdzający, że zawartość jest już wykorzystana.
źródło
Możemy również użyć poniższego kodu, aby uzyskać odpowiedź HTML w java
źródło
Oto prosty sposób, aby to zrobić:
Oczywiście
responseString
z odpowiedzią strony internetowej i typem odpowiedziHttpResponse
zwróconym przezHttpClient.execute(request)
źródło
Poniżej znajduje się fragment kodu, który pokazuje lepszy sposób obsługi treści odpowiedzi jako ciągu, niezależnie od tego, czy jest to poprawna odpowiedź, czy odpowiedź błędu dla żądania HTTP POST:
źródło
Możesz użyć biblioteki innej firmy, która wysyła żądanie HTTP i obsługuje odpowiedź. Jednym z dobrze znanych produktów byłby Apache commons HTTPClient: HttpClient javadoc , HttpClient Maven artefact . Istnieje znacznie mniej znany, ale znacznie prostszy HTTPClient (część napisanej przeze mnie biblioteki MgntUtils typu open source): MgntUtils HttpClient javadoc , MgntUtils maven artefact , MgntUtils Github . Korzystając z jednej z tych bibliotek, możesz wysłać żądanie REST i otrzymać odpowiedź niezależnie od Springa w ramach logiki biznesowej
źródło
Jeśli używasz Jacksona do deserializacji treści odpowiedzi, jednym bardzo prostym rozwiązaniem jest użycie
request.getResponseBodyAsStream()
zamiastrequest.getResponseBodyAsString()
źródło