如何阅读HttpURLConnection的完整回复?

我在andorid中创建一些修改http标头的代理服务器,它工作正常,但我必须将完整响应转发到’顶层’。
我如何从HttpURLConnection读取整个响应(所有标题,内容,所有内容)?

HttpURLConnection httpURLConnection; URL url = new URL(ADDRESS); httpURLConnection = (HttpURLConnection) url.openConnection(); // add headers, write output stream, flush if (httpURLConnection.getResponseCode() == HttpsURLConnection.HTTP_OK) { Map<String, List> map = httpURLConnection.getHeaderFields(); System.out.println("Printing Response Header...\n"); for (Map.Entry<String, List> entry : map.entrySet()) { System.out.println("Key : " + entry.getKey() + " ,Value : " + entry.getValue()); } return new DataInputStream(httpURLConnection.getInputStream()); } 

在getInputStream中我只收到内容,可能有一些整个reposne的流?

使用HttpURLConnection无法直接转储完整的HTTP响应,但您可以使用其各种方法来重建它。 例如,

 HttpURLConnection httpURLConnection; URL url = new URL("http://www.google.com"); httpURLConnection = (HttpURLConnection) url.openConnection(); StringBuilder builder = new StringBuilder(); builder.append(httpURLConnection.getResponseCode()) .append(" ") .append(httpURLConnection.getResponseMessage()) .append("\n"); Map> map = httpURLConnection.getHeaderFields(); for (Map.Entry> entry : map.entrySet()) { if (entry.getKey() == null) continue; builder.append( entry.getKey()) .append(": "); List headerValues = entry.getValue(); Iterator it = headerValues.iterator(); if (it.hasNext()) { builder.append(it.next()); while (it.hasNext()) { builder.append(", ") .append(it.next()); } } builder.append("\n"); } System.out.println(builder); 

版画

 200 OK X-Frame-Options: SAMEORIGIN Transfer-Encoding: chunked Date: Tue, 07 Jan 2014 16:06:45 GMT P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info." X-XSS-Protection: 1; mode=block Expires: -1 Alternate-Protocol: 80:quic Set-Cookie: NID=67=OIu8_xhcxE-UPCSfIoTINvRyOe4ALVhIqan2NUI6LMdRkSJHTPGvNkYeYE--WqPSEPK4c4ubvmjWGUyFgXsa453KHavX9gUeKdzfInU2Q25yWP3YtMhsIhJpUQbYL4gq; expires=Wed, 09-Jul-2014 16:06:45 GMT; path=/; domain=.google.ca; HttpOnly, PREF=ID=4496ed99b812997d:FF=0:TM=1389110805:LM=1389110805:S=jxodjb3UjGJSZGaF; expires=Thu, 07-Jan-2016 16:06:45 GMT; path=/; domain=.google.ca Content-Type: text/html; charset=ISO-8859-1 Server: gws Cache-Control: private, max-age=0 

然后,您可以获取InputStream并打印其内容。

当我寻找类似的问题时,起初对我来说并不明显,所以我找到了一个解决方案。

阅读身体反应:

 readFullyAsString(connection.getInputStream(), "UTF-8"); 

这来自: https : //stackoverflow.com/a/10505933/1281350

 public String readFullyAsString(InputStream inputStream, String encoding) throws IOException { return readFully(inputStream).toString(encoding); } private ByteArrayOutputStream readFully(InputStream inputStream) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length = 0; while ((length = inputStream.read(buffer)) != -1) { baos.write(buffer, 0, length); } return baos; }