TCP-сокет HTTP GET-запрос Content-Length> 0, но не возвращает фактический контент - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь запросить службу REST API, размещенную в приложении Tomcat / Spring Boot, используя сокет TCP вместо HTTPClient, поскольку я не могу использовать HTTPClient.Я могу успешно открыть сокет, отправить запрос и получить данные с сервера, но в ответе сервера никогда не возвращается тело или содержимое.Если я использую веб-браузер для запроса того же URL, он работает просто отлично.Вот программа, которую я использую для выполнения запроса:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class SocketClient {

    public SocketClient() {
        String hostname = "192.168.10.104";
        int port = 8080;

        try (Socket socket = new Socket(hostname, port)) {

            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, false);

            writer.println("GET /company/1 HTTP/1.1");
            writer.println("Host: " + hostname + ":" + port);
            writer.println("User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36");
            writer.println("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
            writer.println("Accept-Language: en-US,en;q=0.9");
            writer.println("Accept-Encoding: gzip, deflate, br");
            writer.println("Connection: close");
            writer.println();
            writer.flush();

            InputStream input = socket.getInputStream();

            BufferedReader reader = new BufferedReader(new InputStreamReader(input));

            String line;

            while (!(line = reader.readLine()).equals("")) {
                System.out.println(line);
            }
            socket.close();
        } catch (Exception ex) {

            System.out.println("Server not found: " + ex.getMessage());

        }

    }
}

Сервер отвечает следующими данными:

HTTP/1.1 200 
Content-Type: text/html;charset=UTF-8
Content-Length: 55
Date: Thu, 24 Jan 2019 15:45:00 GMT
Connection: close

В ответе указывается, что на основеContent-Length, но я никогда не получаю сам контент.Можно ли сделать это?Любой совет с благодарностью.

1 Ответ

0 голосов
/ 24 января 2019

Вы прекращаете чтение, когда находите пустую строку. Есть пустая строка, которая отделяет заголовки от контента, так что вы просто не читаете контент.

readLine возвращает ноль, когда сервер закрывает соединение. Измени свой цикл на

while (!(line = reader.readLine()) == null)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...