java - 在 REST 服务中创建 Jersey 客户端

标签 java web-services rest servlets design-patterns

我正在创建一个使用其他 http REST 服务的 http REST 服务。

我正在使用 Jersey Client 调用其他服务,我对 http 客户端的哪种创建模式最好有很多疑问。

目前,我正在使用 EJB 来注入(inject)客户端,该客户端是每个方法共享的单例,但我想删除 java ee 依赖项并使用 Jetty 作为嵌入式应用程序服务器。

我从the doc看到创建客户端是一项昂贵的操作,因此我无法每次需要时都创建一个客户端。

我认为在每个 Servlet/Rest 类的构造函数中创建 1 是更简单的解决方案,但我不确定 servlet 的生命周期(如果为每个请求创建一个实例,则此方法与上一页)

或者创建一个由每个 Servlet/Rest 类共享的 Singleton 可能会更好

或者可能更好的是 N 个客户端池。

关于最后两个解决方案,我需要一些建议...您认为更好的解决方案是什么?

谢谢

最佳答案

根据您的说法,在某些环境中部署了一个REST服务,并且有一个应用程序,一个客户端消费者,它想要访问该服务。

如果我使用 Jersey API 编写一个普通的 Java 类 作为客户端,那么我会写一些这样的东西:

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

Client client = Client.create(); 
WebResource webResource = client
       .resource("http://localhost:8080/rest/example/employees");

ClientResponse response = webResource.accept("application/json")
               .get(ClientResponse.class);
String result = response.getEntity(String.class);

现在假设您正在编写一个servlet,它在您的应用程序中执行一些定义的工作,并且每次它都会使用客户端代码块调用REST Service当您访问 servlet 时,它每次都会创建一个 com.sun.jersey.api.client.Client 实例。

如果您想避免这种情况,那么您可以创建一个初始类,该类将创建一个且唯一的 com.sun.jersey.api.client.Client 实例,并将其设为静态且在任何需要的地方使用相同的引用。 WebResource 应在需要时创建,因为您可能有兴趣调用不同的 URI

如果我处于您的情况,我会遵循这种方法。

关于java - 在 REST 服务中创建 Jersey 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21726392/

相关文章:

ruby-on-rails - 从 Controller 外部销毁资源

java - 如何为JNLP应用程序设置preferIPv4Stack属性?

java - 无法使用 GSON 将某些 JSON 解析为 JsonArray

java - jaxb xjc -wsdl 命令未知位置

java - JAXB : annotation. 引发异常

java - 具有 Html 页面和 Rest Web 服务身份验证的 Spring Security

java - 从 RecognizerIntent 检测语言

java - 如何从源存储库构建 JDK 8

web-services - 将名称值对转换为结构

web-services - 通过 Web 服务与 Dynamics NAV 实时连接