2012-08-23 12 views
16

Tôi vừa bắt đầu sử dụng thư viện HTTP Client của Apache và nhận thấy rằng không có phương thức tích hợp để nhận phản hồi HTTP dưới dạng String. Tôi chỉ tìm kiếm để có được nó như là String để tôi có thể vượt qua nó vào bất cứ thư viện phân tích cú pháp tôi đang sử dụng.Cách được khuyến nghị để nhận phản hồi HTTP dưới dạng Chuỗi khi sử dụng HTTP Client của Apache là gì?

Cách được khuyến nghị để nhận phản hồi HTTP dưới dạng Chuỗi là gì? Đây là mã của tôi để thực hiện yêu cầu:

public String doGet(String strUrl, List<NameValuePair> lstParams) { 

    String strResponse = null; 

    try { 

     HttpGet htpGet = new HttpGet(strUrl); 
     htpGet.setEntity(new UrlEncodedFormEntity(lstParams)); 

     DefaultHttpClient dhcClient = new DefaultHttpClient(); 

     PersistentCookieStore pscStore = new PersistentCookieStore(this); 
     dhcClient.setCookieStore(pscStore); 

     HttpResponse resResponse = dhcClient.execute(htpGet); 
     //strResponse = getResponse(resResponse); 

    } catch (ClientProtocolException e) { 
     throw e; 
    } catch (IOException e) { 
     throw e; 
    } 

    return strResponse; 

} 

Trả lời

44

Bạn có thể sử dụng EntityUtils#toString() cho việc này.

// ... 
HttpResponse response = client.execute(get); 
String responseAsString = EntityUtils.toString(response.getEntity()); 
// ... 
+1

câu trả lời này là cách để đi cho HttpClient. Apache Jersey, theo ý kiến ​​của tôi, dễ dàng hơn nhiều khi làm việc với hơn HttpClient. –

+1

@Paul: Tôi không chắc chắn ý bạn là gì với "Apache Jersey". Không có điều như vậy trong dự án Apache. ["Jersey"] (http://jersey.java.net) là việc thực hiện tham khảo Sun/Oracle của API JAX-RS mà không phải là một ứng dụng khách HTTP. – BalusC

+1

xin lỗi, tôi có nghĩa là áo của mặt trời/oracle. nó chứa một ứng dụng khách http với API thông thạo hơn. –

5

Bạn cần phải tiêu thụ cơ thể phản ứng và nhận được câu trả lời:

BufferedReader br = new BufferedReader(new InputStreamReader(httpresponse.getEntity().getContent())); 

Và sau đó đọc nó:

String readLine; 
String responseBody = ""; 
while (((readLine = br.readLine()) != null)) { 
    responseBody += "\n" + readLine; 
} 

Các responseBody bây giờ chứa trả lời của bạn là chuỗi.

(Đừng quên để đóng BufferedReader cuối cùng: br.close())

1

Bạn có thể làm một cái gì đó như:

Reader in = new BufferedReader(
     new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 

Sử dụng trình đọc bạn sẽ có thể để xây dựng chuỗi của bạn. Nhưng nếu bạn đang sử dụng SAX, bạn có thể cung cấp trực tiếp luồng cho trình phân tích cú pháp. Bằng cách này bạn sẽ không phải tạo chuỗi và bộ nhớ của bạn cũng sẽ thấp hơn.

0

Về conciseness mã nó có thể được sử dụng Fluent API như thế này:

import org.apache.http.client.fluent.Request; 
[...] 
String result = Request.Get(uri).execute().returnContent().asString(); 

Các tài liệu cảnh báo rằng mặc dù phương pháp này là không lý tưởng về mặt tiêu thụ bộ nhớ.

Các vấn đề liên quan