我怎样才能得到一个HTTP响应正文在Java中的string?

我知道曾经有一种方法来获得它与Apache公共许可证logging在这里: http : //hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpMethod.html和一个例子在这里:

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

但我相信这是不赞成的。 有没有其他的方法来在java中获取http请求,并获得响应正文作为一个string,而不是一个stream?

每个我能想到的图书馆都会返回一个stream。 您可以使用Apache Commons IO中的 IOUtils.toString()在一个方法调用中将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作为最佳猜测,而不是使用本地系统默认值。

以下是我的工作项目中的两个例子。

  1. 使用EntityUtilsHttpEntity

     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); 

下面是我使用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以Stringforms获取响应正文。 很简单。

这在具体情况下相对简单,但在一般情况下相当棘手。

 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响应头 。

该头部包含有关负载的信息,并可能定义文本数据的编码。 即使您采用文本types ,也可能需要检查内容本身以确定正确的字符编码。 例如,请参阅HTML 4规范 ,了解有关如何为特定格式执行此操作的详细信息。

一旦编码已知,可以使用InputStreamReader来解码数据。

这个答案取决于服务器做的是正确的事情 – 如果你想处理响应标题与文档不匹配的情况,或者文档声明与所使用的编码不匹配,那就是另一个鱼的水壶。

这个怎么样?

 org.apache.commons.io.IOUtils.toString(new URL("http://www.someurl.com/")); 

McDowell的答案是正确的。 但是,如果您在上面的post中尝试其他build议。

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

然后它会给你非法状态exception,说明内容已经被使用了。

以下是使用Apache HTTP Client库以Stringforms访问响应的一种简单方法。

 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); 

我们可以使用下面的代码来获取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); } } 

这是一个轻量级的方法:

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

当然responseString包含网站的响应和响应是HttpResponsetypes,由HttpClient.execute(request)返回,