#java #spring-boot
Вопрос:
Рассмотрим приведенный ниже код.Здесь, когда код состояния, возвращаемый ответом, равен 200, выполнение кода работает идеально.
Но если я попытаюсь вернуть код состояния 400, то в указанной строке будет обнаружено исключение.
*Ответ на ошибку: Внутренняя ошибка сервера в : Ошибка ввода-вывода GetResponse при запросе POST для «http://localhost:8090/get-data»: Сервер вернул код ответа HTTP: 400 для URL: http://localhost:8090/get-data; вложенным исключением является исключение java.io.IOException: Сервер вернул код ответа HTTP: 400 для URL: http://localhost:8090/get-data
соединение: закрыто, длина содержимого: 485, тип содержимого: приложение/json, дата: Чт, 08 апреля 2021 20:25:47 GMT*
Почему возникает исключение при возврате статуса 400?
@RestController
Class ABC{
@Autowired
RestTemplate template;
@PostMapping("....")
ResponseEntity<Object> getResponse(){
ResponseEntity<String> response
try{
HttpEntity<Object> body=new HttpEntity(obj,header); // data obj amp; httpheader
response=template.postForEntity("http://localhost:8090/get-
data",body,String.class);
}catch(HttpStatusCodeException ex){
throw....
}catch(Exception ex){
throw Internal Server Error..... //Exception is thrown here
}
if(response.getStatusCodeValue()==200){
...
}
...
}
}
@RestController
Class XYZ{
@PostMapping("/get-data")
ResponseEntity<Object> getTheStatus(@RequestHeader HttpHeaders headers ,@ResponseBody MyData data){
return new ResponseEntity<>("",HttpStatus.BAD_REQUEST);
}
}
Ответ №1:
В контексте HTTP статус ответа 200 означает успешный ответ. Статусы 4xx и 5xx представляют некоторые проблемы. Проблема может быть связана с запросом, подключением, сервером или другим источником. Некоторые реализации HTTP-клиента, такие как RestTemplate, будут создавать исключения в случае кода состояния «неуспешный», поскольку состояние ответа «неуспешный» представляет собой неудачное выполнение.
Если вы хотите избежать исключений, вы можете добавить обработчик ошибок.
public class RestTemplateResponseErrorHandler
implements ResponseErrorHandler {
@Override
public boolean hasError(ClientHttpResponse httpResponse) throws IOException {
return false;
}
@Override
public void handleError(ClientHttpResponse httpResponse) throws IOException {}
}
RestTemplate restTemplate = restTemplateBuilder
.errorHandler(new RestTemplateResponseErrorHandler())
.build();
template.postForEntity("http://localhost:8090/get-data", body, String.class);
Комментарии:
1. я хочу выполнить так-> если(response.getStatusCodeValue()==400) {… тогда сделай это…} ..как я это сделаю ?
2. Вы можете использовать пользовательский обработчик ошибок ответа.
Ответ №2:
это происходит из-за передачи HttpStatus.BAD_REQUEST
Комментарии:
1. ДА… даже если параметры неверны, то статус 200 не должен правильно выполнять функцию, верно? Проблема в том, когда я возвращаю BAD_REQUEST
2. когда вы передали HttpStatus. BAD_REQUEST возвращает ответ с 400. для правильного ответа передайте HttpStatus.OK
3. что делать, если микросервис выдаст ошибку запроса, и как я получу этот ответ, если верну 200..?
4. используйте try catch или if else и передайте указанный код ошибки, если вы зафиксировали ошибку.
Ответ №3:
ИМХО, возвращающий статусы 4xx, подобные этому, не лучший способ, используйте @ControllerAdvice
вместо этого