java - 从 Jersey Client 1.x 升级到 Jersey Client 2.x

标签 java jersey jersey-2.0 jersey-client jersey-1.0

我正在使用 jersey-client-1.9 .示例代码:

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 = client.resource("http://localhost:8047/storage/hive.json");
String input = //rest request
ClientResponse response = webResource.type("application/json").post(ClientResponse.class, input);
String queryRespose = response.getEntity(String.class);

由于该项目已从 com.sun.jersey.api.client 更改至org.glassfish.jersey.client .如何在 jersey-client-2.8 中实现这一点?

编辑:

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8047/query.json");
String input =//rest request
Response response = target.request().post(Entity.json(input));
String queryRespose = response.readEntity(String.class);

这有效... :)

最佳答案

使用 Jersey 2.x,您可以构建 ClientClientBuilder

Client client = ClientBuilder.newClient();
在 Jersey 2.x WebTarget类似于 Jersey 1.x WebResource , 而不是调用 client.resource()获取 WebResource ,您调用client.target()获取 WebTarget
WebTarget target = client.target(url); 
那你需要调用request()WebTarget获取 Invocation.Builder ,这将允许您链接其他调用
Invocation.Builder invocation = target.request();
要发送实体,我们需要传递 Entity Invocation.Builder 之一的请求方法。例如
Response response = builder.post(Entity.json(input);
要阅读响应,请使用 response.readEntity(String.class) .所以总的来说,你可以做
Client client = ClientBuilder.newClient();
WebTarget target = client.target(url);
Response response = target.request().post(Entity.json(input));
String entity = response.readEntity(String.class);
另见:
  • how to send json object from REST client using javax.ws.rs.client.WebTarget
  • Client API documentation

  • 更新
    您可能还需要以下依赖项来支持 JSON/POJO
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    
    然后注册JacksonFeature与客户。就是这样 input (如果你想使用 POJO 而不是 String)可以序列化为 JSON
    client.register(JacksonFeature.class);
    

    关于java - 从 Jersey Client 1.x 升级到 Jersey Client 2.x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32042944/

    相关文章:

    java - 在Hadoop Reducer中合并str值

    java - ElasticSearch 占用 100% CPU

    jersey - 使用 Jersey InMemoryTestContainerFactory 的示例/教程

    java - 在生成的事件流值中找不到 Spring 的 SSEmitter 事件 "name"属性

    java - 如何在 Jersey 2.12 中获取 HK2 ServiceLocator?

    java - android异步读取usb

    java - 为什么 java 允许它编译,在这种情况下它解释多个 + 符号是什么?

    java - 带有 Jersey 的 OPTIONS 请求的 CORS header

    java - 如何将 Jackson ObjectMapper 与 Guice/Jersey Hook

    java - 使用 jackson 从 json 中删除空值