我正在尝试使用 feign 客户端发送自定义主机标头,但消费者应用程序没有选择它们。我使用的是 spring boot feign 而不是 openfeign。
除了 Host 之外,其他所有标头似乎都按预期工作。
ResponseEntity<JSONObject> list(@PathVariable("name") String name,
@RequestParam("id") String id, @RequestParam("modelName") String modelName,
@RequestHeader(value = "Authorization", required = true) String authorizationHeader,
@RequestHeader(value = "Host", required = true) String hostName);
当我将主机名传递为“xyz.com”时,消费者应用程序仍然采用默认主机标头。
在消费者代码中,当我从控制器类读取主机标头的值时,我没有得到 zyz.com。相反,它从 dns 名称中选择。
同样的问题发生在我身上 -
@Param
和 @Headers
对于“Host”标头不起作用。
我更改的两件事解决了该问题 - 使用 OkHttpClient
,并在构建客户端时添加 requestInterceptor
:
client = Feign.builder()
.client(new OkHttpClient())
.requestInterceptor(request -> request.header("Host", hostHeaderValue))
.target(MyClient.class, url);
解决方案包含在springframework中。添加您的属性文件:
feign.okhttp.enabled = true
并添加okhttp3的依赖,pom中的例子
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
您可以在这里找到更多信息
你可以试试
System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
允许使用受限标头