3

我正在使用以下代码发送简单的 HTTP 请求:

try
{
    Socket  s = new Socket ();
    s.bind    (new InetSocketAddress (ipFrom, 0));
    s.connect (new InetSocketAddress (ipTo,   80), 1000);

    PrintWriter     writer = new PrintWriter    (s.getOutputStream ());
    BufferedReader  reader = new BufferedReader (new InputStreamReader (s.getInputStream ()));

    writer.print ("GET " + szUrl + " HTTP/1.0\r\n\r\n"); 
    writer.flush ();

    s     .close ();
    reader.close ();
    writer.close ();
}

但是,如您所见,我不发送自定义 HEADER。我应该添加什么来发送自定义 HEADER ?

4

6 回答 6

6

不要尝试自己实现 HTTP 协议。

使用Apache 的HttpComponents

(或其较旧且更易于使用的版本 - HttpClient

于 2010-02-06T18:59:44.497 回答
5

当你写

writer.print ("GET " + szUrl + " HTTP/1.0\r\n\r\n"); 

\r\n\r\n位发送换行/回车以结束行,然后发送另一个以指示没有更多标题。这是 HTTP 和电子邮件格式的标准,即空行表示标题的结尾。为了添加额外的标题,您只需要在完成之前不要发送该序列。您可以改为执行以下操作

writer.print ("GET " + szUrl + " HTTP/1.0\r\n"); 
writer.print ("header1: value1\r\n"); 
writer.print ("header2: value2\r\n"); 
writer.print ("header3: value3\r\n"); 
// end the header section
writer.print ("\r\n"); 
于 2010-02-06T19:11:08.527 回答
1

即使我建议尝试 Bozho 提到的 HttpComponents 而不是自己实现 HTTP,这也是添加自定义标头的方法:

 writer.print ("GET " + szUrl + " HTTP/1.0\r\n"); 
 writer.print ("X-MyOwnHeader: SomeValue\r\n");
于 2010-02-06T19:03:08.697 回答
1

你应该使用已经准备好用于 http 连接的类,就像HTTPUrlConnection那是一个孩子UrlConnection并且有这个方法

void setRequestProperty(String key, String value)

应该用于设置请求的参数(如HEADER字段)..在这里查看以供参考

于 2010-02-06T19:03:14.000 回答
1

您还可以看到 URLConnection。

https://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLConnection.html

于 2010-02-06T19:03:32.540 回答
0

如果您绝对必须自己手动完成,则必须遵循这种格式,每个标题都在自己的行中。

名称:价值

查看 HTTP 规范中的标头格式。

http://www.w3.org/Protocols/HTTP/1.0/draft-ietf-http-spec.html#Message-Headers

于 2010-02-06T19:01:42.970 回答