web-dev-qa-db-ja.com

Javaでhttpレスポンスボディを文字列として取得する方法を教えてください。

私はここで文書化されているようにApacheコモンズでそれを取得する方法があったことを知っていました: http://hc.Apache.org/httpclient-legacy/apidocs/org/Apache/commons/httpclient/HttpMethod .html とその例を次に示します。

http://www.kodejava.org/examples/416.html

しかし、これは廃止予定だと思います。 httpでJavaでリクエストを取得し、レスポンスボディをストリームではなく文字列として取得する方法は他にありますか?

129
Danish94

私が考えることができるすべてのライブラリはストリームを返します。 1回のメソッド呼び出しでInputStreamStringに読み込むには、 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が使用されます。

90
WhiteFang34

これが私の作業プロジェクトからの2つの例です。

  1. EntityUtils および HttpEntity を使用する

    HttpResponse response = httpClient.execute(new HttpGet(URL));
    HttpEntity entity = response.getEntity();
    String responseString = EntityUtils.toString(entity, "UTF-8");
    System.out.println(responseString);
    
  2. BasicResponseHandler を使う

    HttpResponse response = httpClient.execute(new HttpGet(URL));
    String responseString = new BasicResponseHandler().handleResponse(response);
    System.out.println(responseString);
    
239
spideringweb

これは私が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として取得するだけです。とても簡単です。

47
moonlightcheese

これは特定のケースでは比較的単純ですが、一般的なケースではかなりトリッキーです。

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-TypeHTTPレスポンスヘッダ によって異なります。

このヘッダはペイロードに関する情報を含み、mightはテキストデータのエンコーディングを定義します。 テキストタイプ と仮定しても、正しい文字エンコーディングを決定するためにコンテンツ自体を調べる必要があるかもしれません。 E.g。その特定のフォーマットでそれを行う方法についての詳細は HTML 4 spec を参照してください。

エンコードがわかったら、 InputStreamReader を使用してデータをデコードできます。

この答えはサーバが正しいことをしているかどうかに依存します - レスポンスヘッダがドキュメントと一致しない場合やドキュメント宣言が使用されるエンコーディングと一致しない場合を処理する場合魚のもう一つのやかん。

28
McDowell

これだけ?

org.Apache.commons.io.IOUtils.toString(new URL("http://www.someurl.com/"));
9
Eric Schlenz

以下は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);
9
lkamal

マクドウェルの答えは正解です。あなたが上記の投稿のいくつかで他の提案を試みるならしかし。

HttpEntity responseEntity = httpResponse.getEntity();
if(responseEntity!=null) {
   response = EntityUtils.toString(responseEntity);
   S.O.P (response);
}

その後、コンテンツがすでに消費されていることを示すillegalStateExceptionが発生します。

6
Akshay

以下のコードを使用して、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);

    }
}
2
Subhasish Sahu

これを行うための軽量な方法は次のとおりです。

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)によって返されます。

0
Marko Zajc

Jacksonを使用して応答本文をデシリアライズする場合、1つの非常に簡単な解決策は、代わりにrequest.getResponseBodyAsStream()を使用することです request.getResponseBodyAsString()

0

Httpリクエストを送信してレスポンスを処理する3-Dパーティのライブラリを使用できます。よく知られた製品の1つは、Apache Commons HTTPClientです。/​​ HttpClient javadocHttpClient Mavenアーティファクト 。あまり知られていないがもっと単純なHTTPClient(私が書いたオープンソースのMgntUtilsライブラリの一部)があります: MgntUtils HttpClient javadocMgntUtils mavenアーティファクトMgntUtils Github 。どちらのライブラリを使用しても、ビジネスロジックの一部として、REST要求を送信したり、Springから独立して応答を受信したりできます。

0
Michael Gantman

次に示すのは、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;
    }
}
0
Krutik