【发布时间】:2017-03-17 07:01:30
【问题描述】:
从this question 尝试了此代码。当只是请求stackoverflow.com 时,它会给出正确的回复,但是当我尝试https://stackoverflow.com/questions/10673684/send-http-request-manually-via-socket 时,它会返回HTTP/1.1 400 Bad Request。是什么导致了这个问题?
这是我从上面的链接得到的工作代码,它给出了来自服务器的正确响应。
Socket s = new Socket(InetAddress.getByName("stackoverflow.com"), 80);
PrintWriter pw = new PrintWriter(s.getOutputStream());
pw.println("GET / HTTP/1.1");
pw.println("Host: stackoverflow.com");
pw.println("");
pw.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String t;
while ((t = br.readLine()) != null) {
System.out.println(t);
}
br.close();
尝试将其更改为以下...
Socket s = new Socket(InetAddress.getByName("stackoverflow.com"), 80);
PrintWriter pw = new PrintWriter(s.getOutputStream());
pw.println("GET / HTTP/1.1");
pw.println("Host: https://stackoverflow.com/questions/10673684/send-http-request-manually-via-socket");
pw.println("");
pw.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String t;
while ((t = br.readLine()) != null) {
System.out.println(t);
}
那么回复是HTTP/1.1 400 Bad Request。
附:我不打算使用任何 http 库。
【问题讨论】:
-
主机应该保持在工作代码中,但您必须将主机上方的行更改为
GET /questions/10673684/send-http-request-manually-via-socket HTTP/1.1 -
@Alex 您应该将该评论作为答案
-
嗨@Alex。你说的对。太感谢了。如果你要回答我会标记它。
-
另外你应该使用
\r\n作为行尾而不是\n并且你不应该期望服务器在响应之后关闭连接,因为你已经通过使用HTTP版本隐式请求持久连接1.1。出于同样的原因,您还需要能够处理数据的分块传输编码。建议在实现协议时查看适当的标准,而不仅仅是猜测行为。