2.2.2. 使用 HTTP 客户端实施 RESTEasy


默认情况下,在 RESTEasy 中处理客户端和服务器之间的网络通信。它使用 Apache Http Components 项目中的 Http Client。RESTEasy 客户端框架和网络之间的接口由 ClientHttpEngine 接口定义。

RESTEasy 随附此接口的四种实施:默认实施是 ApacheHttpClient43Engine。此实施使用 Apache 4.3。

ApacheHttpClient4Engine 是一种使用比 Apache 4.3 更早的版本的实现。此类提供向后兼容性。RESTEasy 根据 Apache 版本检测自动选择这两个 ClientHttpEngine 实施之一。InMemoryClientEngine 是一种将请求分配到同一 JVM 中的服务器的实施,而 URLConnectionEngine 则是使用 java.net.HttpURLConnection 的一种实施。

客户端执行器可以传递给特定的 ClientRequest

ResteasyClient client = new
ResteasyClientBuilder().httpEngine(engine).build();

RESTEasy 和 HttpClient 做出默认决策以使用客户端框架,而无需引用 HttpClient。但是,在某些应用中,可能需要深入查看 HttpClient 详细信息。ApacheHttpClient43EngineApacheHttpClient4Engine 可以提供 org.apache.http.client.HttpClientorg.apache.http.protocol.HttpContext 的实例,它们将额外的配置详细信息传输到 HttpClient 层。例如,身份验证可以配置如下:

// Configure HttpClient to authenticate preemptively
// by prepopulating the authentication data cache.

// 1. Create AuthCache instance
AuthCache authCache = new BasicAuthCache();

// 2. Generate BASIC scheme object and add it to the local auth cache
AuthScheme basicAuth = new BasicScheme();
authCache.put(new HttpHost("sippycups.bluemonkeydiamond.com"), basicAuth);

// 3. Add AuthCache to the execution context
BasicHttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.AUTH_CACHE, authCache);

// 4. Create client executor and proxy
HttpClient httpClient = HttpClientBuilder.create().build();
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient, localContext);
ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build();

HttpContextProvider 是 RESTEasy 提供的接口,您可以使用它为 Apache Http Client43Engine 和 ApacheHttpClient4Engine 实施提供自定义 Http Context

注意

了解释放连接 和关闭连接之间的区别非常重要。释放连接使其可以重复利用。关闭连接会释放其资源,使其无法使用。

RESTEasy 在没有通知的情况下释放连接。唯一的计数器示例是响应是 InputStream 实例,它必须显式关闭。

另一方面,如果调用的结果是 Response 实例,则必须使用 Response .close() 方法来释放连接。

WebTarget target = client.target("http://localhost:8081/customer/123");
Response response = target.request().get();
System.out.println(response.getStatus());
response.close();

您可以在一个 试用的 块中执行此操作。释放连接使其可用于另一用途。它通常不关闭套接字。

如果创建了任何开放的套接字,ApacheHttpClient4Engine.finalize() 将关闭它一直使用的 HttpClient。依靠 JDK 调用 finalize() 并不安全。如果 HttpClient 传递给 ApacheHttpClient4Executor,用户必须关闭连接,如下所示:

HttpClient httpClient = new HttpClientBuilder.create().build();
ApacheHttpClient4Engine executor = new ApacheHttpClient4Engine(httpClient);
...
httpClient.getConnectionManager().shutdown();
注意

如果 ApacheHttpClient4Engine 创建了自己的 HttpClient 实例,则无需等待 finalize() 关闭打开套接字。ClientHttpEngine 接口具有一个 close() 方法来实现这一目的。

最后,如果 javax.ws.rs.client.Client 类已自动创建引擎,请调用 Client.close( )。这个调用会清理任何套接字连接。

2.2.2.1. HTTP 重定向

基于 Apache H ttpClient 的 ClientHttpEngine 实施支持 HTTP 重定向。默认情况下禁用此资源。您可以通过将 setFollowRedirects 方法设置为 true 来启用 此功能,如下所示:

ApacheHttpClient43Engine engine = new ApacheHttpClient43Engine();
engine.setFollowRedirects(true);
Client client = new ResteasyClientBuilder().httpEngine(engine).build();
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.