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。这就更清楚了。谢谢