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

似乎有许多关于通过Jersey 1.x创建RESTful客户端的示例,但是没有关于Jersey 2.0或更高版本的示例.
我提到了其他问题和Jersey网站,但是由于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”,“ application / 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号(即整数值).但是,似乎我需要将“类”和/或“实体”值设置为参数,但是在Jersey网站上看不到任何与它们相关的信息.

解决方法:

对于第一段代码:

406 means Not Acceptable.

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

Invocation.Builder request(MediaType... acceptedResponseTypes)

Start building a request to the targeted web resource and define the accepted response media types.
Invoking this method is identical to:

webTarget.request().accept(types);

因此,基本上,在您的请求中,您说的是仅接受:文本/纯文本.现在查看您的资源方法.看@Produces.它们都不“产生”文本/纯文本.都是json或xml.这就是为什么您会得到例外.在客户端将接受更改为application / xml(或MediaType.APPLICATION_XML),您将不再遇到此错误.

对于第二个问题:我假设您的意思是,当您从浏览器进行测试时,为什么它能正常工作.

如果您仅通过输入url从浏览器发送请求,它将发出带有许多Accept类型的请求.如果您有Firebug(适用于FireFox)或开发人员工具(适用于Chrome),则如果发送请求,则会看到类似于以下内容的标头

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

您可以在其中看到application / xml.即使application / xml不存在,通配符* / *也存在,所以在浏览器中工作时,基本上所有媒体类型都可以作为返回类型.

对于您的最后一个问题:

查看Invocation.Builder的扩展API,该API为SyncInvoker.您将看到不同的重载put和post方法,正如您提到的,其中大多数接受实体.

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

> Entity.entity(body,mediaType)
> Entity.json(正文)
> 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));

在内部,客户将转换为XML.如果您使用Entity.json将转换为JSON,但是您需要确保您具有JSON提供程序依赖项.默认情况下,Jersey不会附带一个.看到更多在Support for Common Media Type Representations

还要注意,对于您的方法查找,当您尝试向该方法发出请求时,请求应以整数值结尾,因为这是为{id} path参数指定的类型.

上一篇:Java.NIO Selector及SelectionKey 侵立删


下一篇:java-如何配置项目以将JSON提供程序与jersey-restful Web服务一起使用