Stimp
Stimp

Reputation: 589

How to define global static header on Spring Boot Feign Client

I have a spring boot app and want to create a Feign client which has a statically defined header value (for auth, but not basic auth). I found the @Headers annotation but it doesn't seem to work in the realm of Spring Boot. My suspicion is this has something to do with it using the SpringMvcContract.

Here's the code I want to work:

@FeignClient(name = "foo", url = "http://localhost:4444/feign")
@Headers({"myHeader:value"})
public interface LocalhostClient {

But it does not add the headers.

I made a clean spring boot app with my attempts and posted to github here: github example

The only way I was able to make it work was to define the RequestInterceptor as a global bean, but I don't want to do that because it would impact other clients.

Upvotes: 6

Views: 16665

Answers (4)

AElMehdi
AElMehdi

Reputation: 592

You could specify that through the application.yml file:

feign:
  client:
    config:
      default:
        defaultRequestHeaders:
          Authorization:
            - Basic 3ncond2dS3cr2t
          otherHeader:
            - value 

Note that using the default configuration will affect all your Feign Clients. To tune this per client, you can do the following:

feign:
  client:
    config:
      default:
        defaultRequestHeaders:
          # request headers to all feign clients
      my-client-name:
        defaultRequestHeaders:
          Authorization:
            - Basic 4ncond2dS3cr2t
          API_KEY:
            - apiKey

Upvotes: 1

Deepu George Jacob
Deepu George Jacob

Reputation: 474

Try this

@Component
public class AuthFeignInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (requestAttributes != null) {
            final HttpServletRequest httpServletRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
            template.header("Header_name","Value");
        }
    }
}

Upvotes: 1

Ali Daniyal
Ali Daniyal

Reputation: 146

You can also achieve this by adding header to individual methods as follows:

@RequestMapping(method = RequestMethod.GET, path = "/resource", headers = {"myHeader=value"})

Using @Headers with dynamic values in Feign client + Spring Cloud (Brixton RC2) discusses a solution for dynamic values using @RequestHeader.

Upvotes: 13

onnoweb
onnoweb

Reputation: 3038

You can set a specific configuration class on your feign interface and define a RequestInterceptor bean in there. For example:

@FeignClient(name = "foo", url = "http://localhost:4444/feign", 
configuration = FeignConfiguration.class)
public interface LocalhostClient {
}

@Configuration
public class FeignConfiguration {

  @Bean
  public RequestInterceptor requestTokenBearerInterceptor() {
    return new RequestInterceptor() {
      @Override
      public void apply(RequestTemplate requestTemplate) {
        // Do what you want to do
      }
    };
  }
}

Upvotes: 11

Related Questions