java - 使用 java 的 Http 请求的 400 错误请求

标签 java html bad-request

我正在遵循 https://www.codejava.net/java-se/networking/java-socket-client-examples-tcp-ip 中的“4. Java Socket 客户端示例:HTTP 客户端”指令在我的 Mac 上使用 IntelliJ。

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,它添加了缺少的行,但错误没有改变。有趣的是,我的一位 friend 在 Windows 中做了同样的事情,得到了预期的一切。

如有任何帮助,我们将不胜感激。

最佳答案

问题是如何在 Windows 和 Mac 上打印新行,Windows 将新行视为 2 个字符,CR - 回车符 ("\r") + LF- 换行符 ("\n") "\r\n",Mac 仅将新行打印为 LF("\n")。 HTTP 请求期望每一行由 CRLF "\r\n" 分隔,您的代码打印的只是 Mac 上的 "\n""\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");

关于java - 使用 java 的 Http 请求的 400 错误请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61587986/

相关文章:

JavaScript 控制 HREF 的中键/右击 URL

ASP.NET MVC : How to handle 400 bad request error when url end with %

python - HTTP/1.1 400 错误请求。命令部分数量错误

java - 在单元测试中捕获 SQLException 而不是 Spring DataIntegrityViolationException

java - 在 Clojure 中写入文件

java - 如何将 EXIF 元中找到的日期时间转换为 XSD 标准?

javascript - 使用隐藏输入字段使用 li 的数据值作为表单输入

java - 将弹出菜单的选定项目添加到相同格式的文本字段中

javascript - jQuery 图像 slider - 当图像用完时从头开始重新启动

json - 获取 400 错误请求原因 :required from google cloud stoarge json api