我正在创建一个简单的HTTP客户端。我遵循了here的代码示例,该示例适用于www.httbin.org以外的许多站点。当我尝试www.httbin.org时,出现以下错误:
HTTP/1.1 505 HTTP Version Not Supported
Connection: close
Server: Cowboy
Date: Fri, 28 Sep 2018 16:28:50 GMT
Content-Length: 0
我看了其他的答案,但没有帮助。
这是我用于测试此代码的代码:
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
public class Main {
public static void main(String[] args) throws IOException {
//Connection details
InetAddress address = InetAddress.getByName("www.httpbin.org");
Socket mySocket = new Socket(address, 80);
//Streams
PrintWriter mySocketOutput = new PrintWriter(mySocket.getOutputStream(), true);
InputStreamReader inputStreamReader = new InputStreamReader(mySocket.getInputStream());
//Headers
mySocketOutput.println("GET / HTTP/1.0");
mySocketOutput.println("Host: www.httpbin.org");
mySocketOutput.println("Connection: close");
mySocketOutput.println();
boolean loop = true;
StringBuilder stringBuilder = new StringBuilder();
//reading results from server
while (loop) {
if(inputStreamReader.ready()) {
int currentChar = 0;
while (currentChar != -1) {
currentChar = inputStreamReader.read();
stringBuilder.append((char) currentChar);
}
loop = false;
}
}
//print result
System.out.println(stringBuilder.toString());
mySocket.close();
}
}
答案 0 :(得分:2)
虽然您的请求看起来与HTTP类似,但与HTTP相似。根据标准,以HTTP结尾的行是\r\n
,而不是像\n
那样简单的println
。如果在所有地方都使用正确的行尾(例如,对于每行包含内容的行,也对于结尾请求标头的“空”行),它也将与www.httpbin.org
一起使用。
不支持HTTP / 1.1 505 HTTP版本
为什么服务器上的这个令人困惑的答案?由于您的请求在HTTP标头和(空)HTTP主体之间没有适当的分隔符,因此假定它是HTTP 0.9请求。久已淘汰的HTTP 0.9协议不需要仅由\r\n
组成的空行作为请求标头的末尾,因为在HTTP 0.9中首先没有标头和正文之类的东西。
我正在创建一个简单的HTTP客户端。
请不要低估编写适当的HTTP客户端的复杂性。例如,您作为自己的客户端基础引用的代码不仅为请求使用了错误的行尾,而且还声称支持HTTP / 1.1,而无法处理主体的分块传输编码。
如果您真的想学习协议,也许您也应该跳过本网站中的其他代码。至少Thin SMTP Client还使用了损坏的协议实现。