2.2.2. 使用 HTTP 客户端实施 RESTEasy
默认情况下,在 RESTEasy 中处理客户端和服务器之间的网络通信。它使用 Apache Http
。RESTEasy 客户端框架和网络之间的接口由 Components 项目中的 Http
ClientClientHttpEngine
接口定义。
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
详细信息。ApacheHttpClient43Engine
和 ApacheHttpClient4Engine
可以提供 org.apache.http.client.HttpClient
和 org.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 和
ContextApacheHttpClient4Engine
实施提供自定义 Http
了解释放连接 和关闭连接之间的区别非常重要。释放连接使其可以重复利用。关闭连接会释放其资源,使其无法使用。
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();