如何在 Quarkus REST 客户端中配置 cookie 管理?
我正在为一个 API 构建一个客户端,该 API 在登录时设置一个会话 cookie,然后将该会话 cookie 用于身份验证 - 一个非常标准的有状态 API。
似乎默认行为 with@RegisterRestClient
不会在请求之间保留 cookie。
挖掘一下,似乎有ResteasyClientBuilderImpl
一个默认的字段。然后默认情况下也会禁用 cookie。cookieManagementEnabled
false
ClientHttpEngineBuilder43
我还发现,如果您使用异步引擎 ( useAsyncHttpEngine
),则不会使用此同步引擎构建器,并且还会启用 cookie 管理。
ResteasyClientBuilder
我发现配置底层的唯一方法RestClientBuilder
是使用RestClientBuilderListener
. 然而,情节在这里变厚了。
有一种方法RestClientBuilder
- property(String name, Object value)
- 在Quarkus at least
将委托给底层的情况下ResteasyClientBuilder
if (name.startsWith(RESTEASY_PROPERTY_PREFIX)) {
// Makes it possible to configure some of the ResteasyClientBuilder delegate properties
然而,几行下来
Method builderMethod = Arrays.stream(ResteasyClientBuilder.class.getMethods())
.filter(m -> builderMethodName.equals(m.getName()) && m.getParameterTypes().length >= 1)
.findFirst()
.orElse(null);
即它只允许调用非空方法。为了启用 cookie 管理,我需要调用enableCookieManagement
- 它没有参数。
因此,我发现启用 cookie 管理的唯一方法是:
class CookieConfigBuilderListener : RestClientBuilderListener {
override fun onNewBuilder(builder: RestClientBuilder) {
val builderImpl = builder as QuarkusRestClientBuilder
val delegateField = QuarkusRestClientBuilder::class.java.getDeclaredField("builderDelegate")
delegateField.isAccessible = true
val resteasyBuilder = delegateField.get(builderImpl) as ResteasyClientBuilder
resteasyBuilder.enableCookieManagement()
}
}
这显然远非理想,尤其是因为它在 GraalVM 原生图像设置中使用反射,因此可能还需要我在QuarkusRestClientBuilder
.
那么,回到最初的问题,如何在 Quarkus REST 客户端中启用 cookie 管理?