Java에서 http 응답 본문을 문자열로 어떻게 얻을 수 있습니까?


155

http://hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpMethod.html 및 여기에 예제와 같이 아파치 공통점을 사용하는 방법이 있었음을 알고 있습니다.

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

그러나 나는 이것이 더 이상 사용되지 않는다고 생각합니다. java에서 http get 요청을 만들고 응답 본문을 스트림이 아닌 문자열로 얻는 다른 방법이 있습니까?


1
질문과 모든 답변은 아파치 라이브러리에 관한 것이므로 태그로 지정해야합니다. 타사 라이브러리를 사용하지 않으면 아무것도 보이지 않습니다.
e is

답변:


104

내가 생각할 수있는 모든 라이브러리는 스트림을 반환합니다. 당신은 사용할 수 있습니다 IOUtils.toString()에서 아파치 코 몬즈 IO 읽을 InputStream로를 String하나의 메서드 호출에. 예 :

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을 인코딩과 연결했지만 예제에서 사용하는 것을 잊었습니다. 기술적으로 Content-Encoding가능한 경우 응답 의 헤더를 사용해야하지만 UTF-8을 예제에 추가했습니다 .
WhiteFang34

IOUtils의 훌륭한 사용법. 좋은 실용적인 접근 방식.
Spidey

8
실제로 문자셋은 "charset = ..."과 같은 contentType에 지정되지만 'gzip'과 같은 것을 포함하는 contentEncoding에는 지정되지 않습니다
Timur Yusupov

1
이 함수는 입력 스트림을 닫습니다. @ WhiteFang34에 응답을 인쇄하고 http 엔터티를 계속 사용할 수있는 방법이 있습니까?
amIT

274

내 작업 프로젝트의 두 가지 예가 있습니다.

  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

내 경우에는 CloseableHttpClient 응답에서 본문을 가져 왔습니다.
Jaroslav Štreit

1
httpClient 란 무엇입니까?!
Andreas L.

1
@AndreasL. httpClient는 HttpClient 유형입니다 (org.apache.commons.httpclient 패키지)
spideringweb

응답 내용을 문자열 또는 바이트 배열 또는 다른 것으로 얻는 것이 일반적입니다. Entity에서 직접 API를 사용하면 좋을 것입니다. 이 유틸리티 클래스를 찾으려면 이것을 찾아야합니다.
클로스 입센

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

McDowell의 답변은 정답입니다. 그러나 위의 게시물 중 일부에서 다른 제안을 시도하면.

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

그런 다음 콘텐츠가 이미 사용되었음을 나타내는 illegalStateException이 발생합니다.


3

우리는 자바에서 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

0

간단한 방법은 다음과 같습니다.

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

물론 responseString웹 사이트의 응답과 응답 유형이 포함 HttpResponse되어 있습니다.HttpClient.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 요청을 보내고 응답을 처리하는 3 자 라이브러리를 사용할 수 있습니다. 잘 알려진 제품 중 하나는 Apache commons HTTPClient : HttpClient javadoc , HttpClient Maven artifact 입니다. (내게로 작성된 오픈 소스 MgntUtils 라이브러리의 일부) 훨씬 덜 알려진이 아니라 HttpClient를 훨씬 간단 있습니다 MgntUtils HttpClient를 javadoc는 , MgntUtils 받는다는 유물 , MgntUtils Github에서 . 이러한 라이브러리 중 하나를 사용하면 비즈니스 로직의 일부로 REST 요청을 보내고 Spring으로부터 독립적으로 응답을받을 수 있습니다.


0

Jackson을 사용하여 응답 본문을 역 직렬화하는 경우 매우 간단한 해결책 중 하나 request.getResponseBodyAsStream()request.getResponseBodyAsString()

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.