将 Jersey 1.x 客户端转换为 Jersey 2.x 客户端
Convert Jersey 1.x client to Jersey 2.x client
我有以下代码可用于球衣 1.x。但是,我需要让它与 jersey 2.x 一起使用,我注意到很多 jersey classes 和方法从一个版本更改为另一个版本。有什么想法吗?
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 是一个 class,用于设置代理配置。它实现了 HttpURLConnectionFactory,它也是一个 jersey 1.x 接口。
基本类比如下:
Jersey 1.x
Jersey 2.x
Client
javax.ws.rs.client.Client
WebResource
javax.ws.rs.client.WebTarget
ClientResponse
javax.ws.rs.core.Response
要构建客户端,您通常使用 ClientBuilder
静态构建器方法之一。最基本的使用方法是 newClient()
方法,returns 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
,可以加上headers,最后提出请求。您不必将任何新变量分配给 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 class,您希望反序列化响应,然后将 class 传递给 readEntity()
方法。您将需要为任何预期的数据类型提供一个提供程序。例如,如果要转换为 POJO 的 JSON,那么您需要 Jackson 提供程序:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey2.version}</version>
</dependency>
代理服务器
就代理而言,Jersey 有一些您可以设置的属性
-
Client client = ClientBuilder.newClient()
.property(ClientProperties.PROXY_URI, String.format("%s:%s", host, port));
另见
- 有关 Jersey 2.x 客户端的完整文档,请参阅 the docs
我有以下代码可用于球衣 1.x。但是,我需要让它与 jersey 2.x 一起使用,我注意到很多 jersey classes 和方法从一个版本更改为另一个版本。有什么想法吗?
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 是一个 class,用于设置代理配置。它实现了 HttpURLConnectionFactory,它也是一个 jersey 1.x 接口。
基本类比如下:
Jersey 1.x | Jersey 2.x |
---|---|
Client |
javax.ws.rs.client.Client |
WebResource |
javax.ws.rs.client.WebTarget |
ClientResponse |
javax.ws.rs.core.Response |
要构建客户端,您通常使用 ClientBuilder
静态构建器方法之一。最基本的使用方法是 newClient()
方法,returns 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
,可以加上headers,最后提出请求。您不必将任何新变量分配给 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 class,您希望反序列化响应,然后将 class 传递给 readEntity()
方法。您将需要为任何预期的数据类型提供一个提供程序。例如,如果要转换为 POJO 的 JSON,那么您需要 Jackson 提供程序:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey2.version}</version>
</dependency>
代理服务器
就代理而言,Jersey 有一些您可以设置的属性
-
Client client = ClientBuilder.newClient() .property(ClientProperties.PROXY_URI, String.format("%s:%s", host, port));
另见
- 有关 Jersey 2.x 客户端的完整文档,请参阅 the docs