我想使用低级套接字发送http请求然后解析结果,但我无法得到正确的结果,控制台告诉我我的请求无效,任何人都可以帮我找到问题?谢谢!
这是我的代码:
try {
URL url = new URL(request.getUrl());
Socket socket = new Socket(InetAddress.getByName(url.getHost()), 80);
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.print("GET / HTTP/1.1 \r\n");
pw.print("Host: " + url.getHost() + " \r\n");
pw.print("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 \r\n");
pw.print("Accept-Encoding: gzip, deflate \r\n");
pw.print("Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4 \r\n");
pw.print("Cache-Control: max-age=0 \r\n");
pw.print("Connection: keep-alive \r\n");
pw.print("Upgrade-Insecure-Requests: 1 \r\n");
pw.print("User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36 \r\n");
pw.println("\r\n");
pw.flush();
InputStream is = socket.getInputStream();
BufferedReader read = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = read.readLine()) != null) {
buffer.append(line).append('\n');
}
System.out.println(buffer.toString());
} catch (IOException e) {
callback.onFailed(e.getMessage());
}
我放了一个网址" http://www.163.com"作为请求的成员,但控制台显示如下:
HTTP/1.0 400 Bad request
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html><body><h1>400 Bad request</h1>
Your browser sent an invalid request.
</body></html>
我的请求标题有什么问题吗?但我搜索了很多分辨率,例如添加&#34; \ r \ n&#34; ,但它无法解决问题。 谢谢你的帮助!
答案 0 :(得分:3)
您的请求行格式错误 - 您缺少协议(以及标题和其他所有内容)
构建原始请求的原因是什么?对于简单的请求,可以使用库(OkHttpClien,Apache Http Client)或至少HttpUrlConnection
。
你正在使用URL
,它有类似openConnection()
的东西,可以为你做你想做的事。
https://docs.oracle.com/javase/7/docs/api/java/net/URL.html#openConnection()
答案 1 :(得分:1)
pw.print("GET / HTTP/1.1 \r\n");
您的请求行格式错误。来自RFC 2616:
Request-Line =方法SP Request-URI SP HTTP-Version CRLF
你在CRLF之前有一个空格。删除它可以解决问题(并提供302 Moved Permanently结果)。
如果您要实施HTTP,则需要熟悉此RFC及其后续版本。我强烈建议您避免所有这些努力,只需使用HttpURLConnection
即可。它已经完成了。