2016-05-06 7 views
8

Czy można ustawić wartości dynamiczne w nagłówku?Używanie @Headers z wartościami dynamicznymi w 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); 
    } 

Rejestrowanie implementację RequestInterceptor dodaje nagłówek ale nie ma sposobu ustalania wartości nagłówka dynamicznie

@Bean 
    public RequestInterceptor requestInterceptor() { 

     return new RequestInterceptor() { 

      @Override 
      public void apply(RequestTemplate template) { 

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

znalazłem następujący problem na github i jeden z komentujących (lpborges) próbowałem zrobić coś podobnego, używając nagłówków w adnotacji @RequestMapping.

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

poważaniem

Odpowiedz

24

Rozwiązaniem jest użycie @RequestHeader adnotacji zamiast udawać adnotacje

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

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... 

usługa:

@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; 
    } 
    ... 

klient:

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

zastosowanie:

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()); 
... 
1

mam ten przykład, i używam @HeaderParam zamiast @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); 

} 
Powiązane problemy