在 Feign 客户端 + Spring Cloud (Brixton RC2) 中使用 @Headers 和动态值
Using @Headers with dynamic values in Feign client + Spring Cloud (Brixton RC2)
是否可以将动态值设置为 header?
@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 的实现添加 header 但无法动态设置 header 值
@Bean
public RequestInterceptor requestInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
template.header("X-Auth-Token", "some_token");
}
};
}
我在 github 上发现了以下问题,其中一位评论者 (lpborges) 试图在 [=] 中使用 headers 做类似的事情14=]注解.
https://github.com/spring-cloud/spring-cloud-netflix/issues/288
亲切的问候
解决方案是使用@RequestHeader注解,而不是feign特定的注解
@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);
}
@RequestHeader 对我不起作用。起作用的是:
@Headers("X-Auth-Token: {access_token}")
@RequestLine("GET /orders/{id}")
Order get(@Param("id") String id, @Param("access_token") String accessToken);
我用@HeaderMap
as it seems very handy if you are working with Open feign。使用这种方式,您可以动态传递 header 键和值。
@Headers({"Content-Type: application/json"})
public interface NotificationClient {
@RequestLine("POST")
String notify(URI uri, @HeaderMap Map<String, Object> headers, NotificationBody body);
}
现在创建 feign REST 客户端来调用服务端点,创建您的 header 属性映射并将其传递到方法参数中。
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://whosebug.com/example"), headers, new NotificationBody());
@HeaderMap,@Header 和@Param 对我不起作用,下面是当有多个 [=17= 时使用@RequestHeader 的解决方案] 使用FeignClient传递的参数
@PostMapping("/api/channelUpdate")
EmployeeDTO updateRecord(
@RequestHeader Map<String, String> headerMap,
@RequestBody RequestDTO request);
调用代理的代码如下:
Map<String, String> headers = new HashMap<>();
headers.put("channelID", "NET");
headers.put("msgUID", "1234567889");
ResponseDTO response = proxy.updateRecord(headers,requestDTO.getTxnRequest());
您可以使用 HttpHeaders。
@PostMapping(path = "${path}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
ResponseEntity<?> callService(@RequestHeader HttpHeaders headers, @RequestBody Object object);
private HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "1234");
headers.add("CLIENT_IT", "dummy");
return headers;
}
是否可以将动态值设置为 header?
@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 的实现添加 header 但无法动态设置 header 值
@Bean
public RequestInterceptor requestInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
template.header("X-Auth-Token", "some_token");
}
};
}
我在 github 上发现了以下问题,其中一位评论者 (lpborges) 试图在 [=] 中使用 headers 做类似的事情14=]注解.
https://github.com/spring-cloud/spring-cloud-netflix/issues/288
亲切的问候
解决方案是使用@RequestHeader注解,而不是feign特定的注解
@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);
}
@RequestHeader 对我不起作用。起作用的是:
@Headers("X-Auth-Token: {access_token}")
@RequestLine("GET /orders/{id}")
Order get(@Param("id") String id, @Param("access_token") String accessToken);
我用@HeaderMap
as it seems very handy if you are working with Open feign。使用这种方式,您可以动态传递 header 键和值。
@Headers({"Content-Type: application/json"})
public interface NotificationClient {
@RequestLine("POST")
String notify(URI uri, @HeaderMap Map<String, Object> headers, NotificationBody body);
}
现在创建 feign REST 客户端来调用服务端点,创建您的 header 属性映射并将其传递到方法参数中。
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://whosebug.com/example"), headers, new NotificationBody());
@HeaderMap,@Header 和@Param 对我不起作用,下面是当有多个 [=17= 时使用@RequestHeader 的解决方案] 使用FeignClient传递的参数
@PostMapping("/api/channelUpdate")
EmployeeDTO updateRecord(
@RequestHeader Map<String, String> headerMap,
@RequestBody RequestDTO request);
调用代理的代码如下:
Map<String, String> headers = new HashMap<>();
headers.put("channelID", "NET");
headers.put("msgUID", "1234567889");
ResponseDTO response = proxy.updateRecord(headers,requestDTO.getTxnRequest());
您可以使用 HttpHeaders。
@PostMapping(path = "${path}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
ResponseEntity<?> callService(@RequestHeader HttpHeaders headers, @RequestBody Object object);
private HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "1234");
headers.add("CLIENT_IT", "dummy");
return headers;
}