400 Плохой запрос из Http-запроса с использованием java - PullRequest
0 голосов
/ 04 мая 2020

Я следую инструкции "4. Java Socket Client: HTTP-клиент" из https://www.codejava.net/java-se/networking/java-socket-client-examples-tcp-ip в моей Ma c с использованием 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>

Я попытался много решений, но ни одно из них не работает для меня. Единственная проблема, которую я обнаружил, состоит в том, что HttpClient.class скомпилирован с java версия 11 пропущенных строк

writer.println("HEAD " + url.getPath() + " HTTP/1.1");
writer.println("Host: " + hostname);

, затем я изменил java версию на 1.8, он добавил недостающие строки, но ошибка не изменение. Интересно, что один из моих друзей, сделавший то же самое в windows, получил все, как ожидалось.

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 04 мая 2020

Проблема заключается в том, как новые строки печатаются на Windows, а Ma c, Windows обрабатывает новые строки как 2 символа, CR - возврат каретки ("\ r") + LF- перевод строки ("\ n ") "\r\n", Ma c печатает новые строки только как LF("\n"). HTTP-запросы ожидают, что каждая строка будет разделена CRLF "\r\n", то, что печатает ваш код, это просто "\n" на Ma c и "\r\n" на Windows, поэтому он работает, как и ожидалось, на платформе Windows.

Чтобы заставить его работать как на Windows, так и на Ма c, попробуйте следующий код:

            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");
...