Java 如何从 HttpURLConnection 读取完整响应?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20976013/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to read full response from HttpURLConnection?
提问by Andrzej
I make some proxy server in andorid which modify http headers, it works ok, but I have to forward full response to 'top layer'.
How I can read whole response (all headers, content, everything) from 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<String>> map = httpURLConnection.getHeaderFields();
System.out.println("Printing Response Header...\n");
for (Map.Entry<String, List<String>> entry : map.entrySet())
{
System.out.println("Key : " + entry.getKey() + " ,Value : " + entry.getValue());
}
return new DataInputStream(httpURLConnection.getInputStream());
}
In getInputStream I received only content it is possible to have some stream with whole reposne?
在 getInputStream 中,我只收到了内容,有可能有一些包含整个 reposne 的流吗?
采纳答案by Sotirios Delimanolis
There's no way to dump the full HTTP response directly using the HttpURLConnection
, but you can use its various method to reconstruct it. For example,
无法直接使用 转储完整的 HTTP 响应HttpURLConnection
,但您可以使用其各种方法来重建它。例如,
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<String, List<String>> map = httpURLConnection.getHeaderFields();
for (Map.Entry<String, List<String>> entry : map.entrySet())
{
if (entry.getKey() == null)
continue;
builder.append( entry.getKey())
.append(": ");
List<String> headerValues = entry.getValue();
Iterator<String> 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);
prints
印刷
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
You can then get the InputStream
and print its content too.
然后,您也可以获取InputStream
并打印其内容。
回答by Greg
It wasn't obvious to me at first when I looked for a similar problem, so I but I found a solution.
当我寻找类似的问题时,起初对我来说并不明显,所以我找到了解决方案。
Read the body response:
阅读身体反应:
readFullyAsString(connection.getInputStream(), "UTF-8");
and this comes from : https://stackoverflow.com/a/10505933/1281350
这来自: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;
}