Java - 如何将 Headers 传播到 Spring OpenFeign
Java - How to propagate the Headers to Spring OpenFeign
我有一个微服务,它使用 FeignClient(spring 云)调用多个级联微服务。我想在此期间传播所有 header 值,而不在 feign 方法中为每个 header 值声明一个属性。
有办法吗?我无法在网上找到它。
我拥有的 header 的传播样本:
void doSomething(Long id,
@Header("Accept-Language") String language,
@Header("Accept") accept,
@Header("Authorization") authorization,
@Header("Connection") connection, ...)
这里有一个例子,说明如何使用 RequestInterceptor
@Component
class CurrentRequestHeadersInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes instanceof ServletRequestAttributes) {
HttpServletRequest webRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
webRequest.getHeaderNames().asIterator()
.forEachRemaining(h -> template.header(h, webRequest.getHeader(h)));
}
}
}
至于 AnnotatedParameterProcessor
,我找到了一种从请求中仅添加一个 header 的方法,但我认为这对您不起作用。
如果您更喜欢显式 header 传递,您可以使用 @RequestHeader
注释将 header 作为 Map
.
传递
@FeignClient(name = "test", url = "localhost:9090")
interface TestClient {
@RequestMapping("/test")
void test(@RequestHeader Map<String, List<String>> headers);
}
然后你可以添加 WebRequest
作为你的控制器的方法参数,将请求转换为 header 的 Map
然后传递给客户端。
我有一个微服务,它使用 FeignClient(spring 云)调用多个级联微服务。我想在此期间传播所有 header 值,而不在 feign 方法中为每个 header 值声明一个属性。
有办法吗?我无法在网上找到它。
我拥有的 header 的传播样本:
void doSomething(Long id,
@Header("Accept-Language") String language,
@Header("Accept") accept,
@Header("Authorization") authorization,
@Header("Connection") connection, ...)
这里有一个例子,说明如何使用 RequestInterceptor
@Component
class CurrentRequestHeadersInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes instanceof ServletRequestAttributes) {
HttpServletRequest webRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
webRequest.getHeaderNames().asIterator()
.forEachRemaining(h -> template.header(h, webRequest.getHeader(h)));
}
}
}
至于 AnnotatedParameterProcessor
,我找到了一种从请求中仅添加一个 header 的方法,但我认为这对您不起作用。
如果您更喜欢显式 header 传递,您可以使用 @RequestHeader
注释将 header 作为 Map
.
@FeignClient(name = "test", url = "localhost:9090")
interface TestClient {
@RequestMapping("/test")
void test(@RequestHeader Map<String, List<String>> headers);
}
然后你可以添加 WebRequest
作为你的控制器的方法参数,将请求转换为 header 的 Map
然后传递给客户端。