Разница между HttpClientErrorException.getStatusText и HttpClientErrorException.getResponseBodyAsString - PullRequest
0 голосов
/ 23 января 2019

Я использую httpResp.sendError(400, "You are missing customer id"), чтобы отправить ответ обратно

Когда я пытаюсь получить сообщение на стороне клиента (используя шаблон Rest для вызова конечной точки).

Однако, печать HttpClientErrorException всегда дает мне следующий результат:

HttpClientErrorException: 400 null

Я вижу, что у меня HttpClientErrorException.getResponseBody есть вся информация о отметке времени, сообщении и т. Д. Но HttpClientErrorException.getStatusText всегда пуст.

У меня вопрос: как спроектировать ResponseEntity на стороне сервера таким образом, чтобы HTTP-клиент находил сообщение об исключении на стороне сервера в response.getStatusText () вместо null?

вот код, который у меня есть

        try{
        ResponseEntity<String> responseEntity = restTemplate.exchange(uri, HttpMethod.POST, requestEntity, String.class );
        System.out.println(responseEntity.getBody());
    }
    catch (HttpClientErrorException | HttpServerErrorException e) {
        if (e.getStatusCode().equals(HttpStatus.UNAUTHORIZED) || e.getStatusCode().equals(HttpStatus.FORBIDDEN)) {                System.out.println("Response Body returned:");
            System.out.println(e.getResponseBodyAsString());
            System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
            System.out.println("Status text is:");
            System.out.println(e.getStatusText());

        } else if (e.getStatusCode().equals(HttpStatus.BAD_REQUEST)) {
            System.out.println("Response Body returned:");
            System.out.println(e.getResponseBodyAsString());
            System.out.println("-------------------------------");
            System.out.println("Status text is:");
            System.out.println(e.getStatusText());
        } else {
                throw e;
        }
    }

Версия загрузки Sprint: 2.1.0.RELEASE

1 Ответ

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

Я проследил код для того, как RestTemplate фактически делает звонки.В основном, что происходит, результат HttpClientErrorException.getStatusText() заполняется текстом кода состояния HTTP, а не вашим пользовательским сообщением об ошибке.Например, вместо возврата кода ошибки 400 сервер может вернуть ошибку возврата 400 Bad Request.Вместо кода состояния 200 сервер может вернуть обратно 200 OK.Если сервер ответит этим необязательным текстом, это то, что вы увидите, когда позвоните getStatusText().Обратите внимание, что такой текст, как OK и Bad Request, не может быть настроен вами на стороне сервера.

Это происходит потому, что внутренне Spring использует SimpleClientHttpResponse.getStatusText() который внутренне полагается на HttpUrlConnection.getResponseMessage().Как вы можете видеть из Javadoc getResponseMessage, возвращаемые возможные значения не должны быть пользовательскими сообщениями об ошибках.Обратите внимание, что в вашем случае getStatusText() возвращает null, потому что ваш сервер просто отправляет обратно строку состояния, такую ​​как 400, а не 400 Bad Request.Вы также можете увидеть это из Javadoc.Вероятно, вы можете настроить свой сервер на отправку обратно текстовых сообщений с кодом состояния, но это все равно не поможет вам использовать метод getStatusText() для получения настраиваемого сообщения об ошибке.

Следовательно, HttpClientErrorException.getStatusText() просто нетне то, что вам нужно.Вместо этого вам нужно продолжать звонить getResponseBodyAsString().Однако, если вам известен формат тела ответа, отправляемого обратно с сервера (поскольку он, вероятно, будет заключен в HTML и другие элементы), вы можете использовать регулярное выражение для отфильтровывания ненужных частей сообщения ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...