2016-05-06 1 views
8

È possibile impostare valori dinamici su un'intestazione?Utilizzo di @Headers con valori dinamici in client Feign + 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); 
    } 

Registrazione un'implementazione RequestInterceptor aggiunge dell'intestazione ma non c'è modo di impostare il valore di intestazione dinamicamente

@Bean 
    public RequestInterceptor requestInterceptor() { 

     return new RequestInterceptor() { 

      @Override 
      public void apply(RequestTemplate template) { 

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

ho trovato il seguente problema su github e uno dei commentatori (lpborges) stava cercando di fare qualcosa di simile usando le intestazioni nell'annotazione @RequestMapping.

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

Cordiali saluti

risposta

24

La soluzione è quella di utilizzare @RequestHeader annotazioni invece di annotazioni specifiche fingere

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

servizio:

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

cliente:

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

uso:

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

ho questo esempio, e io uso @HeaderParam invece @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); 

} 
Problemi correlati