为什么我得到一个"无效请求"我使用Socket发送http请求时出错?

时间:2017-07-12 10:28:23

标签: java sockets http

我想使用低级套接字发送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; ,但它无法解决问题。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

您的请求行格式错误 - 您缺少协议(以及标题和其他所有内容)

enter image description here

构建原始请求的原因是什么?对于简单的请求,可以使用库(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即可。它已经完成了。