Mar*_*sen 2 quarkus quarkus-rest-client
我有一个服务公开了许多 Jax-RS 接口。我现在想使用这些接口来连接服务。我正在使用 Quarkus,这意味着我正在使用 microprofile Rest 客户端。因为我已经有了 JaxRS 接口,所以使用 @RegisterRestClient 方法并不是真正可行。相反,我使用 RestClientBuilder。
MyService client = RestClientBuilder.newBuilder()
.baseUri(URI.create("https://localhost:8080"))
.build(MyService.class);
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是身份验证。我需要访问的服务被锁定在基本身份验证后面。我找到的所有关于 microprofile REST 客户端的指南都是这个的变体版本的变体,其中解决方案是添加 headerparam。但这是不可能的,因为我已经预先制作了界面,并且复制粘贴整个内容来添加标头参数确实是我宁愿避免的事情。
还应该提到的是,我尝试过使用 @Provider 过滤器来设置标头,但我似乎无法弄清楚如何使用该方法仅针对单个 REST 客户端,而且我有几个。
那么:如何使用 microprofile Rest 客户端设置基本身份验证而不干扰 Jax-Rs 接口本身?
更新
从 Quarkus 3.9 开始,您将能够执行以下操作:
@Path("/my")
@ClientBasicAuth(username = "${service.username}", password = "${service.password}")
public interface MyService {
}
Run Code Online (Sandbox Code Playgroud)
其中service.username和service.password是必须在运行时设置为允许访问正在调用的服务的用户名和密码的配置属性。
原答案
您应该能够使用@ClientHeaderParam上的注释MyService。就像是:
@Path("/my")
@ClientHeaderParam(name = "Authorization", value = "{lookupAuth}")
public interface MyService {
default String lookupAuth() {
return "Basic " +
Base64.getEncoder().encodeToString("someuser:somepass".getBytes());
}
}
Run Code Online (Sandbox Code Playgroud)
请参阅此了解更多详细信息
如果无法修改接口,您有两种选择:
@ClientHeaderParam(name = "Authorization", value = "{lookupAuth}")
public interface MyServiceWrapper extends MyService {
default String lookupAuth() {
return "Basic " + Base64.getEncoder().encodeToString("someuser:somepass".getBytes());
}
}
Run Code Online (Sandbox Code Playgroud)
ClientRequestFilter填充标题Authorization:@Priority(Priorities.AUTHENTICATION)
public class BasicRequestFilter implements ClientRequestFilter {
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, getAccessToken());
}
private String getAccessToken() {
return "Basic " + Base64.getEncoder().encodeToString("someuser:somepass".getBytes());
}
}
Run Code Online (Sandbox Code Playgroud)
并注册过滤器,例如以编程方式:
MyService client = RestClientBuilder.newBuilder()
.register(BasicRequestFilter.class)
.baseUri(URI.create("https://localhost:8080"))
.build(MyService.class);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8699 次 |
| 最近记录: |