Feign REST Client: Как получить статус HTTP? - PullRequest
1 голос
/ 26 июня 2019

У меня настроен клиент Feign с Hystrix, и я пытаюсь записать все коды состояния HTTP, которые я получаю от своих вызовов API, в базу данных. Таким образом, это означает, что если один из моих вызовов даст мне 201, я бы хотел записать это в БД. Если мой вызов приводит к сбою, мой обработчик резервирования, очевидно, может записать это, но я хочу сделать вставку БД в одном месте. Есть ли у сима способ получить доступ к ответам или какой-то общий обратный вызов?

Ответы [ 2 ]

0 голосов
/ 18 июля 2019

Другой вариант - создать собственную реализацию feign.Logger, переопределив метод logAndRebufferResponse:

protected Response logAndRebufferResponse(
   String configKey, Level logLevel, Response response, long elapsedTime);

Это может быть проще, чем создание Decoder, и он гарантированно будет вызываться при получении ответа независимо от статуса. Decoder вызывается только в том случае, если запрос не вызывает ошибку.

0 голосов
/ 27 июня 2019

Вы должны предоставить пользовательский decoder, чтобы получить ответ в ResponseEntity<Object>.

NotificationClient notificationClient = Feign.builder()
                .encoder(new JacksonEncoder())
                .decoder(customDecoder())
                .target(Target.EmptyTarget.create(NotificationClient.class));

Здесь вы определяете свой пользовательский компонент декодера.Вы можете определить свой собственный, внедрив Decoder, но я использую пружинный декодер.

@Bean
public Decoder customDecoder() {
    HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(customObjectMapper());
    ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(jacksonConverter);
    return new ResponseEntityDecoder(new SpringDecoder(objectFactory));
}

Теперь соберите ваш ответ в ResponseEntity<Object>

ResponseEntity<Object> response = notificationClient.notify();
int status = response.getStatusCodeValue();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...