使用 jersey 1.x 将 java 代码转换为 jersey 2.x 代理另见

如何解决使用 jersey 1.x 将 java 代码转换为 jersey 2.x 代理另见

我有以下代码适用于 jersey 1.x。但是,我需要让它与 jersey 2.x 一起使用,并且我注意到很多 jersey 类和方法一个版本更改为另一个版本。有什么想法吗?

Client client = null;

try {
    URLConnectionClientHandler ch = new URLConnectionClientHandler(new ProxyConnectionFactory(proxyHost,proxyPort));
    client = new Client(ch);
    WebResource webResource = client.resource(url);
    ClientResponse response = ((Builder) webResource.type("application/json").header(authKey,authCreds)).post(ClientResponse.class,input);
    
    String output = (String) response.getEntity(String.class);
    System.out.println(output);
    if (response.getStatus() != 200) {
        System.out.println("Status Failed,Status: " + response.getStatus());
    }
    else {
        System.out.println("Connection Successful!");
        //additional code
    }
    
} catch (Exception e) {
    System.out.println("Exception occurred");
} finally {
    client.destroy();
}

在这代码片段中,ProxyConnectionFactory 是一个设置代理配置的类。它实现了 HttpURLConnectionFactory,它也是一个 jersey 1.x 接口。

解决方法

基本类型类似物如下:

球衣 1.x 球衣 2.x
Client javax.ws.rs.client.Client
WebResource javax.ws.rs.client.WebTarget
ClientResponse javax.ws.rs.core.Response

要构建客户端,您通常使用 ClientBuilder 静态构建器方法之一。要使用的最基本的方法是 newClient() 方法,它返回 Client

的新实例
Client client = ClientBuider.newClient();

如果您需要配置客户端,可以通过多种方式进行。例如,如果您需要注册一些属性或提供者,您可以:

  • 在构建时进行配置:

    Client client = ClientBuilder.newBuilder()
            .property("...","...")
            .register(SomeProvider.class)
            .build();
    
  • 使用 ClientConfig

    ClientConfig config = new ClientConfig()
            .property("...","...")
            .register(SomeProvider.class);
    Client client = ClientBuilder.newClient(config);
    
  • 直接配置客户端

    Client client = ClientBuilder.newClient();
    client.property("...","...");
    client.register(SomeProvider.class);
    

拥有 Client 后,您希望获得 WebTarget。您可以通过为 Client#target() 方法提供 URI 来实现。

Client client = ClientBuilder.newClient();
WebTarget target = client.target(uri);

如果您需要对 URI 执行任何操作,例如添加路径、查询参数或矩阵参数,您可以在 WebTarget 上执行此操作。否则,您现在将调用 WebTarget#request() 方法来获取 Invocation.Builder

Client client = ClientBuilder.newClient();
WebTarget target = client.target(uri);
Invocation.Builder invBuilder = target.request();

使用 Invocation.Builder,您可以添加标头并最终发出请求。您不必为 Invocation.Builder(甚至 WebTarget)分配任何新变量。我这样做是为了演示目的。您可以继续链接方法调用。例如

Client client = ClientBuilder.newClient();
client.target(url)
        .request()
        .header(authHey,authCreds)

最后要发出请求,您将使用 Invocation.Builder 的 HTTP 方法之一。在您的情况下,它将是 post() 方法。您可以将 Entity 传递给此方法,结果将是 Response

Client client = ClientBuilder.newClient();
Response res = client.target(url)
        .request()
        .header(authHey,authCreds)
        .post(Entity.json(input));

要阅读响应,请使用 Response#readEntity(Class)

String data = res.readEntity(String.class);

如果您有一个 POJO 类,您希望将响应反序列化,然后将该类传递给 readEntity() 方法。您将需要为任何预期的数据类型提供一个提供程序。例如,如果将 JSON 转换为 POJO,那么您将需要 Jackson 提供程序:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey2.version}</version>
</dependency>

代理

就代理而言,Jersey 有一些您可以设置的属性

  • ClientProperties.PROXI_URI

    Client client = ClientBuilder.newClient()
            .property(ClientProperties.PROXY_URI,String.format("%s:%s",host,port));
    

另见

  • 有关 Jersey 2.x 客户端的完整文档,请参阅 the docs

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?