2012-08-23 9 views
16

Właśnie zacząłem używać biblioteki klienta HTTP Apache i zauważyłem, że nie ma wbudowanej metody uzyskiwania odpowiedzi HTTP w postaci ciągu. Po prostu szukam go jako String, więc mogę go przekazać do dowolnej biblioteki parsowania, której używam.Jaki jest zalecany sposób uzyskania odpowiedzi HTTP jako ciąg podczas korzystania z klienta HTTP Apache?

Jaki jest zalecany sposób uzyskania odpowiedzi HTTP jako ciąg? Oto mój kod żądania:

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; 

} 

Odpowiedz

44

Możesz użyć do tego celu EntityUtils#toString().

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

ta odpowiedź jest sposobem na uzyskanie HttpClient. Apache Jersey jest, moim zdaniem, o wiele łatwiejszy w pracy niż HttpClient. –

+1

@Paul: Nie jestem pewien co masz na myśli mówiąc o "Apache Jersey". W projekcie Apache nie ma czegoś takiego. ["Jersey"] (http://jersey.java.net) to implementacja referencyjna Sun/Oracle interfejsu API JAX-RS, która w ogóle nie jest klientem HTTP. – BalusC

+1

Przepraszam, miałem na myśli koszulę Sun/Oracle. zawiera klienta http z bardziej płynnym interfejsem API. –

5

Trzeba spożywać ciało odpowiedzi i uzyskać odpowiedź:

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

a następnie odczytać go:

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

responseBody zawiera teraz swoją odpowiedź jako ciąg.

(Nie zapomnij zamknąć BufferedReader w końcu: br.close())

1

można zrobić coś takiego:

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

Korzystanie z czytnika będzie można zbudować ciąg. Ale jeśli używasz SAX, możesz bezpośrednio przekazać strumień do parsera. W ten sposób nie będziesz musiał tworzyć napisu, a Twój ślad pamięci również będzie niższy.

0

chodzi o zwięzłość kodu może być pomocą Fluent API takiego:

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

Dokumentacja ostrzega jednak, że takie podejście nie jest idealny pod względem zużycia pamięci.

Powiązane problemy