获取原始HTTP响应标头 [英] Getting raw HTTP response headers

查看:134
本文介绍了获取原始HTTP响应标头的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆