Сервер отправляет синтетический ответ на ошибку, созданный с помощью retrofit2.Response.error и кода 4xy, но клиент получает ответ с кодом 200

#java #spring #rest #retrofit2 #response

Вопрос:

Чтобы проверить свой обработчик ошибок, я пытаюсь создать синтетический ответ на ошибку и вернуть его. Я хочу вернуть ответ с кодом 4xy (например, 408). Вот как я это делаю на стороне сервера:

 @RequestMapping(value = "/syntheticError")
public Response<String> responseError() {
    return Response.error(408, okhttp3.ResponseBody.create(MediaType.parse("text/plain"), "Hello from server"));
}
 

Но на стороне клиента я все еще вижу код ответа 200.
Моя клиентская сторона:

 private void makeRequest(Retrofit retrofit) {
    WebService service = retrofit.create(WebService.class);
    Call<String> call = service.callError();
    try {
        Response<String> response = call.execute();
        System.out.println("Error code = "   response.code());
        String responseBody = response.body();
        System.out.println("Response body: "   responseBody);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
 

И это дает мне выход:

Код ошибки = 200

Тело ответа: {«успешно»:ложь}

Так что это не увенчалось успехом, но код ответа по-прежнему равен 200. Почему на стороне клиента я не вижу код, который я отправил со стороны сервера?

UPD

Чтобы избежать этой проблемы, я изменил API дооснащения на API springframework на своей стороне сервера. Вместо retrofit2.Response<String> того, чтобы я вернулся ResponseEntity<String> :

 @RequestMapping(value = "/syntheticError")
public ResponseEntity<String> responseError() {
    return ResponseEntity.status(408).body("Some response from server");
}
 

Но если кто — нибудь знает и может объяснить, почему это произошло- я буду благодарен.