私はここで文書化されているようにApacheコモンズでそれを取得する方法があったことを知っていました: http://hc.Apache.org/httpclient-legacy/apidocs/org/Apache/commons/httpclient/HttpMethod .html とその例を次に示します。
http://www.kodejava.org/examples/416.html
しかし、これは廃止予定だと思います。 httpでJavaでリクエストを取得し、レスポンスボディをストリームではなく文字列として取得する方法は他にありますか?
私が考えることができるすべてのライブラリはストリームを返します。 1回のメソッド呼び出しでInputStream
をString
に読み込むには、 Apache Commons IO から IOUtils.toString()
を使用できます。例えば。:
URL url = new URL("http://www.example.com/");
URLConnection con = url.openConnection();
InputStream in = con.getInputStream();
String encoding = con.getContentEncoding();
encoding = encoding == null ? "UTF-8" : encoding;
String body = IOUtils.toString(in, encoding);
System.out.println(body);
更新:上記の例を変更し、可能であればレスポンスからのコンテンツエンコーディングを使用します。そうでなければ、ローカルシステムのデフォルトを使用する代わりに、最善の推測としてデフォルトのUTF-8が使用されます。
これが私の作業プロジェクトからの2つの例です。
EntityUtils
および HttpEntity
を使用する
HttpResponse response = httpClient.execute(new HttpGet(URL));
HttpEntity entity = response.getEntity();
String responseString = EntityUtils.toString(entity, "UTF-8");
System.out.println(responseString);
HttpResponse response = httpClient.execute(new HttpGet(URL));
String responseString = new BasicResponseHandler().handleResponse(response);
System.out.println(responseString);
これは私がApacheのhttpclientライブラリを使って取り組んでいた別の簡単なプロジェクトからの例です:
String response = new String();
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("j", request));
HttpEntity requestEntity = new UrlEncodedFormEntity(nameValuePairs);
HttpPost httpPost = new HttpPost(mURI);
httpPost.setEntity(requestEntity);
HttpResponse httpResponse = mHttpClient.execute(httpPost);
HttpEntity responseEntity = httpResponse.getEntity();
if(responseEntity!=null) {
response = EntityUtils.toString(responseEntity);
}
entityUtilsを使ってレスポンスボディをStringとして取得するだけです。とても簡単です。
これは特定のケースでは比較的単純ですが、一般的なケースではかなりトリッキーです。
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://stackoverflow.com/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.getContentMimeType(entity));
System.out.println(EntityUtils.getContentCharSet(entity));
答えはContent-Type
HTTPレスポンスヘッダ によって異なります。
このヘッダはペイロードに関する情報を含み、mightはテキストデータのエンコーディングを定義します。 テキストタイプ と仮定しても、正しい文字エンコーディングを決定するためにコンテンツ自体を調べる必要があるかもしれません。 E.g。その特定のフォーマットでそれを行う方法についての詳細は HTML 4 spec を参照してください。
エンコードがわかったら、 InputStreamReader を使用してデータをデコードできます。
この答えはサーバが正しいことをしているかどうかに依存します - レスポンスヘッダがドキュメントと一致しない場合やドキュメント宣言が使用されるエンコーディングと一致しない場合を処理する場合魚のもう一つのやかん。
これだけ?
org.Apache.commons.io.IOUtils.toString(new URL("http://www.someurl.com/"));
以下はApache HTTPクライアントライブラリを使用して文字列としてレスポンスにアクセスする簡単な方法です。
import org.Apache.http.HttpResponse;
import org.Apache.http.client.HttpClient;
import org.Apache.http.client.ResponseHandler;
import org.Apache.http.client.methods.HttpGet;
import org.Apache.http.impl.client.BasicResponseHandler;
//...
HttpGet get;
HttpClient httpClient;
// initialize variables above
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpClient.execute(get, responseHandler);
マクドウェルの答えは正解です。あなたが上記の投稿のいくつかで他の提案を試みるならしかし。
HttpEntity responseEntity = httpResponse.getEntity();
if(responseEntity!=null) {
response = EntityUtils.toString(responseEntity);
S.O.P (response);
}
その後、コンテンツがすでに消費されていることを示すillegalStateExceptionが発生します。
以下のコードを使用して、JavaでHTMLレスポンスを取得することもできます。
import org.Apache.http.client.HttpClient;
import org.Apache.http.client.methods.HttpGet;
import org.Apache.http.impl.client.DefaultHttpClient;
import org.Apache.http.HttpResponse;
import Java.io.BufferedReader;
import Java.io.InputStreamReader;
import org.Apache.log4j.Logger;
public static void main(String[] args) throws Exception {
HttpClient client = new DefaultHttpClient();
// args[0] :- http://hostname:8080/abc/xyz/CheckResponse
HttpGet request1 = new HttpGet(args[0]);
HttpResponse response1 = client.execute(request1);
int code = response1.getStatusLine().getStatusCode();
try (BufferedReader br = new BufferedReader(new InputStreamReader((response1.getEntity().getContent())));) {
// Read in all of the post results into a String.
String output = "";
Boolean keepGoing = true;
while (keepGoing) {
String currentLine = br.readLine();
if (currentLine == null) {
keepGoing = false;
} else {
output += currentLine;
}
}
System.out.println("Response-->" + output);
} catch (Exception e) {
System.out.println("Exception" + e);
}
}
これを行うための軽量な方法は次のとおりです。
String responseString = "";
for (int i = 0; i < response.getEntity().getContentLength(); i++) {
responseString +=
Character.toString((char)response.getEntity().getContent().read());
}
もちろん、Webサイトのレスポンスを含むresponseString
とレスポンスはHttpResponse
の型で、HttpClient.execute(request)
によって返されます。
Jacksonを使用して応答本文をデシリアライズする場合、1つの非常に簡単な解決策は、代わりにrequest.getResponseBodyAsStream()
を使用することです request.getResponseBodyAsString()
Httpリクエストを送信してレスポンスを処理する3-Dパーティのライブラリを使用できます。よく知られた製品の1つは、Apache Commons HTTPClientです。/ HttpClient javadoc 、 HttpClient Mavenアーティファクト 。あまり知られていないがもっと単純なHTTPClient(私が書いたオープンソースのMgntUtilsライブラリの一部)があります: MgntUtils HttpClient javadoc 、 MgntUtils mavenアーティファクト 、 MgntUtils Github 。どちらのライブラリを使用しても、ビジネスロジックの一部として、REST要求を送信したり、Springから独立して応答を受信したりできます。
次に示すのは、HTTP POST要求に対する有効な応答かエラー応答かにかかわらず、応答本文をStringとして処理するためのより良い方法を示すコードスニペットです。
BufferedReader reader = null;
OutputStream os = null;
String payload = "";
try {
URL url1 = new URL("YOUR_URL");
HttpURLConnection postConnection = (HttpURLConnection) url1.openConnection();
postConnection.setRequestMethod("POST");
postConnection.setRequestProperty("Content-Type", "application/json");
postConnection.setDoOutput(true);
os = postConnection.getOutputStream();
os.write(eventContext.getMessage().getPayloadAsString().getBytes());
os.flush();
String line;
try{
reader = new BufferedReader(new InputStreamReader(postConnection.getInputStream()));
}
catch(IOException e){
if(reader == null)
reader = new BufferedReader(new InputStreamReader(postConnection.getErrorStream()));
}
while ((line = reader.readLine()) != null)
payload += line.toString();
}
catch (Exception ex) {
log.error("Post request Failed with message: " + ex.getMessage(), ex);
} finally {
try {
reader.close();
os.close();
} catch (IOException e) {
log.error(e.getMessage(), e);
return null;
}
}