2016-05-06 20 views
8

Có thể đặt giá trị động cho tiêu đề không?Sử dụng @Headers với giá trị động trong ứng dụng 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); 
    } 

Đăng ký một thực hiện RequestInterceptor thêm tiêu đề nhưng không có cách thiết lập các giá trị tiêu đề động

@Bean 
    public RequestInterceptor requestInterceptor() { 

     return new RequestInterceptor() { 

      @Override 
      public void apply(RequestTemplate template) { 

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

tôi phát hiện lỗi sau trên github và một trong những bình luận (lpborges) đang cố gắng làm điều gì đó tương tự bằng cách sử dụng các tiêu đề trong chú thích @RequestMapping.

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

Kind Regards

Trả lời

24

Các giải pháp là sử dụng chú thích @RequestHeader thay vì chú thích cụ thể giả vờ

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

dịch vụ:

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

khách hàng:

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

sử dụng:

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

Tôi có ví dụ này, và tôi sử dụng @HeaderParam thay @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); 

} 
Các vấn đề liên quan