Рассмотрим приведенный ниже код. Здесь когда код состояния, возвращаемый ответом, равен 200, выполнение кода работает отлично.
Но если я попытаюсь вернуть код состояния 400, то в указанной строке будет обнаружено исключение.
* Ответ об ошибке: внутренняя ошибка сервера в: ошибка ввода-вывода getResponse при запросе POST для «http: // localhost: 8090 / get-data»: сервер вернул код ответа HTTP: 400 для URL: http: // localhost: 8090 / get -данные; вложенное исключение - java.io.IOException: сервер вернул код ответа HTTP: 400 для URL: http: // localhost: 8090 / get-data
соединение: close, content-length: 485, content-type: application / json, date: Thu, 08 Apr 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 & 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);
}
}




это происходит из-за передачи HttpStatus.BAD_REQUEST
когда вы передаете HttpStatus.BAD_REQUEST, он возвращает ответ с 400. для правильного ответа пройдите HttpStatus.OK
что, если микросервис выдает ошибку запроса, и как я получу этот ответ, если верну 200 ..?
используйте try catch или if else и передайте указанный код ошибки, если вы зафиксировали ошибку.
ИМХО, возвращение таких статусов 4xx не лучший способ, вместо этого используйте @ControllerAdvice
В 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);
я хочу сделать это -> if (response.getStatusCodeValue () == 400) {... тогда сделай это ...} .. как я это сделаю?
Вы можете использовать собственный ResponseErrorHandler.
да ... даже если параметры неверны, то статус 200 не должен правильно выполнять функцию, верно? Проблема в том, когда я возвращаю BAD_REQUEST