복붙노트

[SPRING] Feign 클라이언트 + Spring Cloud (Brixton RC2)에서 동적 값을 사용하여 @Headers 사용

SPRING

Feign 클라이언트 + Spring Cloud (Brixton RC2)에서 동적 값을 사용하여 @Headers 사용

동적 값을 헤더에 설정할 수 있습니까?

@FeignClient(name="Simple-Gateway")
interface GatewayClient {
    @Headers("X-Auth-Token: {token}")
    @RequestMapping(method = RequestMethod.GET, value = "/gateway/test")
        String getSessionId(@Param("token") String token);
    }

RequestInterceptor의 구현을 등록하면 헤더가 추가되지만 헤더 값을 동적으로 설정할 방법이 없습니다.

@Bean
    public RequestInterceptor requestInterceptor() {

        return new RequestInterceptor() {

            @Override
            public void apply(RequestTemplate template) {

                template.header("X-Auth-Token", "some_token");
            }
        };
    } 

github에서 다음 문제를 발견했으며 주석 작성자 (lpborges) 중 하나가 @RequestMapping 주석의 머리글을 사용하여 비슷한 작업을 시도하고있었습니다.

https://github.com/spring-cloud/spring-cloud-netflix/issues/288

친절 감사합니다

해결법

  1. ==============================

    1.해결 방법은 특정 주석을 대체하는 대신 @RequestHeader 주석을 사용하는 것입니다.

    해결 방법은 특정 주석을 대체하는 대신 @RequestHeader 주석을 사용하는 것입니다.

    @FeignClient(name="Simple-Gateway")
    interface GatewayClient {    
        @RequestMapping(method = RequestMethod.GET, value = "/gateway/test")
        String getSessionId(@RequestHeader("X-Auth-Token") String token);
    }
    
  2. ==============================

    2.이 예제를 가지고 @RequestHeader 대신 @HeaderParam을 사용합니다.

    이 예제를 가지고 @RequestHeader 대신 @HeaderParam을 사용합니다.

    import rx.Single;
    
    import javax.ws.rs.Consumes;
    import javax.ws.rs.HeaderParam;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.core.HttpHeaders;
    import javax.ws.rs.core.MediaType;
    
    
    @Consumes(MediaType.APPLICATION_JSON)
    public interface  FeignRepository {
    
      @POST
      @Path("/Vehicles")
      Single<CarAddResponse> add(@HeaderParam(HttpHeaders.AUTHORIZATION) String authorizationHeader, VehicleDto vehicleDto);
    
    }
    
  3. ==============================

    3.@RequestHeader가 작동하지 않았습니다. 무엇이 일 했는가 :

    @RequestHeader가 작동하지 않았습니다. 무엇이 일 했는가 :

    @Headers("X-Auth-Token: {access_token}")
    @RequestLine("GET /orders/{id}")
    Order get(@Param("id") String id, @Param("access_token") String accessToken);
    
  4. ==============================

    4.https://github.com/spring-cloud/spring-cloud-netflix/issues/760 https://github.com/OpenFeign/feign/#basics

    https://github.com/spring-cloud/spring-cloud-netflix/issues/760 https://github.com/OpenFeign/feign/#basics

    17.3 Creating Feign Clients Manually
    http://cloud.spring.io/spring-cloud-static/Dalston.SR4/single/spring-cloud.html#_creating_feign_clients_manually
    

    pojo :

    public class User...
    

    서비스:

    @RestController
    public class HelloController ...
        public User getUser(@RequestParam("name") String name) {
            User user = new User();
            user.setName(name + "[result]");
            System.out.println("name: " + name);
            return user;
        }
        ...
    

    고객:

    public interface HelloClient {
        @RequestLine("POST /getUser?name={name}")
        User getUser(@Param("name") String name);
    }
    

    용도:

    import feign.codec.Decoder;
    import feign.codec.Encoder;
    import feign.Client;
    public class Demo {
        private HelloClient helloClient;
        @Autowired
        public Demo(Decoder decoder, Encoder encoder, Client client) {
            this.userAnotherService = Feign.builder().client(client)
                    .encoder(encoder)
                    .decoder(decoder)
                    // for spring security
                    .requestInterceptor(new BasicAuthRequestInterceptor("username", "password"))
                    .target(UserAnotherService.class, "http://your-service-name");
        }
    ...
    ...method...
    // output --> hello spring cloud![result]
    System.out.println(helloClient.getUser("hello spring cloud!").getName());
    ...
    
  5. from https://stackoverflow.com/questions/37066331/using-headers-with-dynamic-values-in-feign-client-spring-cloud-brixton-rc2 by cc-by-sa and MIT license