java - 来自 Http 请求的 400 错误请求使用 java
问题描述
我正在使用 IntelliJ 在我的 Mac 中遵循https://www.codejava.net/java-se/networking/java-socket-client-examples-tcp-ip中的“4. Java 套接字客户端示例:HTTP 客户端”指令.
Http 配置很简单:
PrintWriter writer = new PrintWriter(output, true);
writer.println("HEAD " + url.getPath() + " HTTP/1.1");
writer.println("Host: " + hostname);
writer.println("User-Agent: Simple Http Client");
writer.println("Accept: text/html");
writer.println("Accept-Language: en-US");
writer.println("Connection: close");
writer.println();
我在 IntelliJ 中没有任何更改就复制了代码来测试它是如何工作的。然而,在我按照指示做了“java HttpClient.java”和“java HttpClient http://www.codejava.net/java-core ”之后,我得到的是:
HTTP/1.1 400 Bad Request
Date: Mon, 04 May 2020 07:51:30 GMT
Server: Apache
Content-Length: 420
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<p>Additionally, a 400 Bad Request
error was encountered while trying to use an ErrorDocument to handle the request.</p>
<hr>
<address>Apache Server at gator3107.hostgator.com Port 80</address>
</body></html>
我尝试了许多解决方案,但没有一个对我有用。我发现的唯一问题是使用 java 版本 11 编译的 HttpClient.class 错过了
writer.println("HEAD " + url.getPath() + " HTTP/1.1");
writer.println("Host: " + hostname);
然后我将 java 版本更改为 1.8 它添加了缺少的行,但错误没有改变。有趣的是,我的一个朋友在 Windows 中做同样的事情,一切都如预期的那样。
任何帮助,将不胜感激。
解决方案
问题是如何在 Windows 和 Mac 上打印新行,Windows 将新行视为 2 个字符,CR - 回车 ("\r") + LF- 换行 ("\n") "\r\n"
,Mac 仅打印新行LF("\n")
。HTTP 请求期望每一行由 CRLF 分隔"\r\n"
,您的代码打印的只是"\n"
在 Mac 和"\r\n"
Windows 上,这就是它在 Windows 平台上按预期工作的原因。
要使其在 Windows 和 Mac 上运行,请尝试以下代码:
PrintWriter writer = new PrintWriter(output, true);
writer.print("HEAD " + url.getPath() + " HTTP/1.1\r\n");
writer.print("Host: " + hostname+"\r\n");
writer.print("User-Agent: Simple Http Client\r\n");
writer.print("Accept: text/html\r\n");
writer.print("Accept-Language: en-US\r\n");
writer.print("Connection: close\r\n");
writer.print("\r\n");
推荐阅读
- c++ - 数组的高效间接排序
- python - 将训练准确率更新到前端
- mysql - 在 MySQL 表中重建后 auto_increment 列仍然不连续
- angular - 如何从角度 4 的下拉菜单中设置选定的值
- javascript - how to change select box value in jquery or javascript
- xamarin - 使用从 Nib 创建的 MvxTableViewCell 时,我应该在哪里放置初始化/绑定逻辑?
- jquery - No 'Access-Control-Allow-Origin' header is present error using bigcommerce api mvc
- datatable - 带有长查询字符串的 404
- javascript - 以角度形式修补值
- npm - 从 sinopia 本地 NPM 注册表取消发布包