Spring 在外部客户机中使用带有动态值的@Headers+;春季云(Brixton RC2)

Spring 在外部客户机中使用带有动态值的@Headers+;春季云(Brixton RC2),spring,spring-cloud,spring-cloud-netflix,Spring,Spring Cloud,Spring Cloud Netflix,是否可以将动态值设置为标题 @FeignClient(name="Simple-Gateway") interface GatewayClient { @Headers("X-Auth-Token: {token}") @RequestMapping(method = RequestMethod.GET, value = "/gateway/test") String getSessionId(@Param("token") String token);

是否可以将动态值设置为标题

@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
注释中的标题执行类似的操作


解决方案是使用@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);

}
进口接收单台;
导入javax.ws.rs.Consumes;
导入javax.ws.rs.HeaderParam;
导入javax.ws.rs.POST;
导入javax.ws.rs.Path;
导入javax.ws.rs.core.HttpHeaders;
导入javax.ws.rs.core.MediaType;
@使用(MediaType.APPLICATION_JSON)
公共接口虚拟存储库{
@职位
@道路(“/车辆”)
单个add(@HeaderParam(HttpHeaders.AUTHORIZATION)字符串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);
我使用,因为它似乎非常方便,如果你正在与。使用这种方式,您可以动态地传递头键和值

@Headers({"Content-Type: application/json"})
public interface NotificationClient {

    @RequestLine("POST")
    String notify(URI uri, @HeaderMap Map<String, Object> headers, NotificationBody body);
}
@Headers({“内容类型:应用程序/json”})
公共接口通知客户端{
@请求行(“POST”)
字符串通知(URI、@HeaderMap-headers、NotificationBody-body);
}
现在创建假的REST客户端来调用服务端点,创建头属性映射并将其传递到方法参数中

NotificationClient notificationClient = Feign.builder()
    .encoder(new JacksonEncoder())
    .decoder(customDecoder())
    .target(Target.EmptyTarget.create(NotificationClient.class));

Map<String, Object> headers = new HashMap<>();
headers.put("x-api-key", "x-api-value");

ResponseEntity<String> response = notificationClient.notify(new URI("https://stackoverflow.com/example"), headers, new NotificationBody());
NotificationClient NotificationClient=Feign.builder()
.编码器(新的JacksonEncoder())
.decoder(customDecoder())
.target(target.EmptyTarget.create(NotificationClient.class));
Map headers=newhashmap();
headers.put(“x-api-key”、“x-api-value”);
ResponseEntity response=notificationClient.notify(新URI(“https://stackoverflow.com/example“”,标题,新的NotificationBody());

@HeaderMap、@Header和@Param对我不起作用,下面是当有多个头参数要使用假客户端传递时使用@RequestHeader的解决方案

@PostMapping("/api/channelUpdate")
EmployeeDTO updateRecord(
      @RequestHeader Map<String, String> headerMap,
      @RequestBody RequestDTO request);
@PostMapping(“/api/channelUpdate”)
员工需要更新记录(
@请求头映射头映射,
@请求主体请求到请求);
调用代理的代码如下所示:

Map<String, String> headers = new HashMap<>();
headers.put("channelID", "NET");
headers.put("msgUID", "1234567889");
ResponseDTO response = proxy.updateRecord(headers,requestDTO.getTxnRequest());
Map headers=newhashmap();
头.put(“channelID”、“NET”);
headers.put(“msgUID”、“1234567889”);
ResponseDTO response=proxy.updateRecord(headers,requestDTO.getTxnRequest());

@RequestHeader
是一个Spring注释,在使用OpenFeign时应该使用
@Headers+@Param
@RequestHeader
似乎忽略了它的
必需的
默认值
参数。因此,这个包含动态数据的映射从何而来?@WesternGun我添加了一个示例,说明如何使用带有动态头属性的外国客户机,以便使用OpenFeign builder。这就更清楚了。谢谢