获取原始HTTP响应标头 [英] Getting raw HTTP response headers
问题描述
getHeaderField()
方法没有任何方法获得原始响应http头文件为我服务,因为服务器吐出多个'Set-Cookie',其中一些会丢失。
<
在 java.net.URLConnection
,是吗?不,通过 URLconnection
获取原始HTTP响应头是不可能的。您需要回退到低级套接字编程。以下是一个 SSCCE ,只需复制n'paste即可。
package com.stackoverflow.q2307291;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
导入java.net.Socket;
public class Test {
public static void main(String [] args)throws IOException {
String hostname =stackoverflow.com;
int port = 80;
Socket socket = null;
PrintWriter writer = null;
BufferedReader reader = null;
尝试{
socket = new Socket(hostname,port);
writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.println(GET / HTTP / 1.1);
writer.println(Host:+ hostname);
writer.println(Accept:* / *);
writer.println(User-Agent:Java); // 说实话。
writer.println(); //重要的是,否则服务器会期望有更多的请求。
writer.flush();
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
for(String line;(line = reader.readLine())!= null;){
if(line.isEmpty())break; //标题完成时停止。我们对所有的HTML都不感兴趣。
System.out.println(line);
}
} finally {
if(reader!= null)try {reader.close(); } catch(IOException logOrIgnore){}
if(writer!= null){writer.close(); }
if(socket!= null)try {socket.close(); } catch(IOException logOrIgnore){}
}
}
}
为了避免所有尝试这段代码的人都被超载,下面是输出结果的样子:
HTTP / 1.1 200 OK
Cache-Control:private
Content-Type:text / html; charset = utf-8
过期时间:Sun,2010年2月21日20:39:08 GMT
服务器:Microsoft-IIS / 7.5
日期:Sun,21 Feb 2010 20:39:07 GMT
连接:关闭
Content-Length:208969
要了解更多有关发送HTTP请求的低级方法,阅读 HTTP规范。
但是,您可能想要使用 getHeaderFields()
方法代替检索具有多个值的标头。 getHeaderField()
只返回最后一个值,根据链接的API文档。
列表与LT;字符串> cookies = connection.getHeaderFields()。get(Set-Cookie);
Is there any way to get raw response http header?
The getHeaderField()
method doesn't work for me, because server spits multiple 'Set-Cookie' and some of them get lost.
The
getHeaderField()
method doesn't work for me
You're asking this in the context of java.net.URLConnection
, is it? No, obtaining the raw HTTP response headers is not possible with URLconnection
. You'll need to fall back to low-level Socket programming. Here's an SSCCE, just copy'n'paste'n'run it.
package com.stackoverflow.q2307291;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class Test {
public static void main(String[] args) throws IOException {
String hostname = "stackoverflow.com";
int port = 80;
Socket socket = null;
PrintWriter writer = null;
BufferedReader reader = null;
try {
socket = new Socket(hostname, port);
writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.println("GET / HTTP/1.1");
writer.println("Host: " + hostname);
writer.println("Accept: */*");
writer.println("User-Agent: Java"); // Be honest.
writer.println(""); // Important, else the server will expect that there's more into the request.
writer.flush();
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
for (String line; (line = reader.readLine()) != null;) {
if (line.isEmpty()) break; // Stop when headers are completed. We're not interested in all the HTML.
System.out.println(line);
}
} finally {
if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
if (writer != null) { writer.close(); }
if (socket != null) try { socket.close(); } catch (IOException logOrIgnore) {}
}
}
}
To avoid SO being overloaded by everyone trying this snippet, here's how the output will look like:
HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html; charset=utf-8 Expires: Sun, 21 Feb 2010 20:39:08 GMT Server: Microsoft-IIS/7.5 Date: Sun, 21 Feb 2010 20:39:07 GMT Connection: close Content-Length: 208969
To learn more about sending HTTP requests the low-level way, read the HTTP specification.
However, you probably want to make use of getHeaderFields()
method instead to retrieve a header with multiple values. The getHeaderField()
namely only returns the last value, as per the linked API doc.
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");
这篇关于获取原始HTTP响应标头的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!