Feign REST Client: How to get the HTTP status?

Viewed 7900

I have Feign client setup with Hystrix and I am trying to log all the HTTP status codes that I get from my API calls into a database. So this means, if one of my calls give me a 201, I would want to log that into DB. If my call results in a failure, my fallback handler can obviously log that but I want to do the DB inserts in one place. Does feign have a way to get access to responses or some kind of general callback?

2 Answers

You have to provide custom decoder to get your response in ResponseEntity<Object>.

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

Here you define your custom decoder bean. You can define your own by implementing Decoder but I'm using spring decoder.

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

Now collect your response in ResponseEntity<Object>

ResponseEntity<Object> response = notificationClient.notify();
int status = response.getStatusCodeValue();

Another option is to create your own feign.Logger implementation, overriding the logAndRebufferResponse method:

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

This may be simpler than creating a Decoder and is guaranteed to be called when a response is received regardless of status. Decoders are only called if the request does not trigger an error.

Related