如何通过Jersey2.0或更高版本创建RESTful Web服务客户端

时间:2014-12-04 00:07:31

标签: java rest jersey jax-rs jersey-2.0

似乎有很多关于Jersey 1.x创建RESTful客户端的例子, 但不是Jersey 2.0或以上 。 我提到了其他问题和泽西岛的网站,但由于Jersey 2.0和之前的版本之间存在差异,我仍然无法为REST创建客户端。 所以我想提一些建议。

到目前为止,我的编码是这样的。

ClientConfig config = new ClientConfig();
Client client = ClientBuilder.newClient(config);
WebTarget target =  client.target("http://localhost:8080/CustomerBack2211/webresources/entities.customer");

Invocation.Builder invocationBuilder = target.request(MediaType.TEXT_XML_TYPE);
Response response = invocationBuilder.get();
System.out.println(response.getStatus());
System.out.println(response.readEntity(String.class));

这会产生406错误。

但是,当我尝试通过Glassfish服务器测试RESTful服务时,测试工作正常,服务器端类的@GET方法有@Produces({" application / xml",&#34 ;应用/ JSON"})。 所以我不明白为什么上面的代码会在Java应用程序上产生406错误。

(即客户端以下列方式使用@GET方法)

@GET
@Path("{id}")
@Produces({"application/xml", "application/json"})
public Customer find(@PathParam("id") Integer id) {
    return super.find(id);
}

@GET
@Override
@Produces({ "application/xml"})
public List<Customer> findAll() {
    return super.findAll();
}

你们有没有看到我做错了什么,或者你能否建议一个RESTful客户端的例子? 任何建议都会有所帮助......提前感谢!


此外,如果您提供有关如何使用适当的参数调用GET,PUT和DELETE等方法的信息,我将不胜感激。 当我在Glassfish RESTful测试中测试服务器端类时,我只需要输入一个ID号(即整数值)。但是,似乎我需要设置&#34; Class&#34;和/或&#34;实体&#34;值作为参数,但我在泽西岛网站上看不到与它们相关的任何信息。

1 个答案:

答案 0 :(得分:3)

对于第一段代码:

406 means Not Acceptable

查看您的request()方法target.request(MediaType.TEXT_XML_TYPE)。来自request()的Javadoc如果状态

  

Invocation.Builder request(MediaType... acceptedResponseTypes)

     

开始构建对目标Web资源的请求,并定义接受的响应媒体类型。   调用此方法与:

相同      

webTarget.request().accept(types);

所以基本上,在你的请求中,你说你只会Accept: text/plain。现在看看你的资源方法。看看@Produces。他们都没有“产生”text/plain。这都是json或xml。这就是你得到例外的原因。在客户端将接受更改为application/xml(或MediaType.APPLICATION_XML),您不应再出现此错误。

对于第二个问题:我假设您的意思是为什么它在浏览器中测试时会起作用。

如果您只需输入网址即可从浏览器发送请求,则会发送包含多种Accept类型的请求。如果你有firebug(对于FireFox)或开发者工具(对于Chrome),如果你发出请求,你会看到一个类似于

的标题
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

你可以在那里看到application/xml。即使application/xml不存在,外卡*/*也存在,因此在浏览器中工作时基本上几乎所有媒体类型都可以作为返回类型。

关于你的上一个问题:

查看SyncInvoker扩展自Invocation.Builder的API。您会看到不同的已覆盖的putpost方法,其中大部分都是您提到的接受Entity的方法。

有几种不同的方法可以构建Entity,所有这些方法都使用静态方法之一。这是一些

  • Entity.entity(body,mediaType)
  • Entity.json(body)
  • Entity.xml(正文)

还有更多(参见上面的实体链接)。但所有这些静态方法都返回Entity。所以我们可以做类似

的事情
// resource method
@POST
@Consumes(MediaType.APPLICATION_XML)
public Response getResponse(Customer customer) { ... }

// some model class
@XmlRootElement
public class Customer { ... }

// client request
Customer customer = new Customer();
Response response = target.request().post(Entity.xml(customer));

在内部,Customer将转换为XML。如果您使用Entity.json将转换为JSON,,则需要确保您具有JSON提供程序依赖项。泽西岛默认不会带一个。请点击Support for Common Media Type Representations

了解更多信息

另请注意,使用方法find,当您尝试向方法发出请求时,请求应以整数值结束,因为这是为{id}路径参数指定的类型。