400 来自使用java的Http请求的错误请求。

问题描述 投票:0回答:1

我是按照 "4.Java Socket Client Example: a HTTP Client "指令从 https:/www.codejava.netjava-senetworkingjava-socket-client-examples-tcp-ip 在我的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.netjava-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下做同样的事情,得到了一切预期。

任何帮助将是感激的。

java html bad-request
1个回答
0
投票

问题是如何在Windows和Mac上打印新行,Windows将新行视为2个字符,CR-回车("/rr")+LF-换行("/rn")。"\r\n",Mac打印新行为 LF("\n") 仅限。HTTP请求希望每一行都用CRLF隔开。"\r\n",你的代码打印的只是 "\n" 在Mac和 "\r\n" 这就是为什么它能在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");
© www.soinside.com 2019 - 2024. All rights reserved.