Javaで文字列としてhttp応答本文を取得するにはどうすればよいですか?


155

ここに記載されているように、Apache Commonsでそれを取得する方法があったことを知っています:http : //hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpMethod.html とここの例:

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

しかし、これは廃止されたと思います。Javaでhttp get要求を行い、応答本文をストリームではなく文字列として取得する他の方法はありますか?


1
質問とすべての回答はApacheライブラリに関するもののようですので、これにはそのようにタグ付けする必要があります。サードパーティのライブラリを使用しないと何も表示されません。
eis

回答:


104

私が考えることができるすべてのライブラリはストリームを返します。あなたは使用することができますIOUtils.toString()から、ApacheのCommonsのIO読むためInputStreamにはString1回のメソッド呼び出しで。例えば:

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が使用されます。


4
この方法では、OSとユーザー設定に応じて異なるシステムデフォルトのテキストエンコーディングが使用されるため、多くの場合、テキストが破損します。
McDowell

1
@McDowell:おっと、メソッドのjavadocをエンコーディングとリンクしましたが、例でそれを使用するのを忘れていました。今のところ、この例にUTF-8を追加しましたが、技術的にはContent-Encoding、可能であれば応答のヘッダーを使用する必要があります。
WhiteFang34

IOUtilsの優れた使用法。素晴らしい実践的なアプローチ。
Spidey

8
実際には、charsetは「charset = ...」のようなcontentTypeで指定されていますが、「gzip」のようなものを含むcontentEncodingでは指定されていません
Timur Yusupov

1
この関数により、入力ストリームが閉じられます。@ WhiteFang34を使用して応答を出力し、httpエンティティを引き続き使用できます
amIT

274

これが私の作業プロジェクトの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);

10
メソッド1で直面した唯一の問題は、エンティティオブジェクトが実行時に消費され、response.getEntity()現在はとして利用できることですresponseString。もう一度response.getEntity()を実行しようとすると、が返されIllegalStateExceptionます。
Tirtha 2013

私の場合はうまくいきました-CloseableHttpClient応答から本文を取得します。
JaroslavŠtreit16年

1
httpClientとは何ですか?
Andreas L.

1
@AndreasL。httpClientのタイプはHttpClient(org.apache.commons.httpclientパッケージ)
spideringweb

応答コンテンツを文字列またはバイト配列などとして取得するのは一般的です。Entityで直接APIを使用してそれを提供するのが良いでしょう。このutilクラスを見つけるためにこれを探す必要があります。
クラウスイプセン

52

これは、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を使用して、応答の本文を文字列として取得するだけです。とてもシンプル。


28

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

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応答ヘッダーによって異なります

このヘッダは、ペイロードに関する情報が含まれており、可能性があるテキストデータの符号化を定義します。テキストの種類を想定している場合でも、正しい文字エンコードを判別するためにコンテンツ自体を検査する必要がある場合があります。たとえば、その特定の形式でそれを行う方法の詳細については、HTML 4仕様を参照してください。

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

この答えは、サーバーが正しいことを行っているかどうかに依存します。応答ヘッダーがドキュメントと一致しない場合、またはドキュメントの宣言が使用するエンコードと一致しない場合に対処する場合は、別のやかんです。


HashMapとして取得する方法 私はJsonとして応答を受け取ります、それをどのように読むのですか?
user1735921

10

以下は、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

マクダウェルの答えは正しいものです。ただし、上記のいくつかの投稿で他の提案を試してみてください。

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

次に、コンテンツがすでに消費されていることを示すillegalStateExceptionを提供します。


3

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

    }
}

これは非常に良い応答です。これは、サーバーにデータをポストした後の応答です。よくやった。
SlimenTN 2018年

0

これを行うための軽量な方法を次に示します。

String responseString = "";
for (int i = 0; i < response.getEntity().getContentLength(); i++) { 
    responseString +=
    Character.toString((char)response.getEntity().getContent().read()); 
}

もちろんresponseString、ウェブサイトの応答とのタイプである応答を含みHttpResponseHttpClient.execute(request)


0

以下は、HTTP POSTリクエストの有効なレスポンスかエラーレスポンスかにかかわらず、レスポンスボディを文字列として処理するためのより良い方法を示すコードスニペットです。

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

Httpリクエストを送信してレスポンスを処理する3Dパーティーライブラリを使用できます。よく知られている製品の1つは、Apache commons HTTPClient:HttpClient javadocHttpClient Maven Artifactです。はるかに知られていませんが、はるかに単純なHTTPClient(私が作成したオープンソースのMgntUtilsライブラリの一部)があります。MgntUtilsHttpClient javadocMgntUtils maven ArtifactMgntUtils Githubです。これらのライブラリのいずれかを使用すると、RESTリクエストを送信し、ビジネスロジックの一部としてSpringから独立して応答を受信できます。


0

ジャクソンを使用して応答本文をデシリアライズする場合、非常に簡単な解決策の1つはrequest.getResponseBodyAsStream()request.getResponseBodyAsString()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.