Использование @ Headers с динамическими значениями в Feign client + Spring Cloud (Brixton RC2)
можно ли установить динамические значения в заголовок ?
@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
С Уважением
4 ответов
решение состоит в том, чтобы использовать аннотацию @RequestHeader вместо подделки конкретных аннотаций
@FeignClient(name="Simple-Gateway")
interface GatewayClient {    
    @RequestMapping(method = RequestMethod.GET, value = "/gateway/test")
    String getSessionId(@RequestHeader("X-Auth-Token") String token);
}
У меня есть этот пример, и я использую @HeaderParam вместо @RequestHeader:
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);
}
@RequestHeader не работал для меня. Что сработало:
@Headers("X-Auth-Token: {access_token}")
@RequestLine("GET /orders/{id}")
Order get(@Param("id") String id, @Param("access_token") String accessToken);
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());
...
