似乎有许多关于通过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网站上看不到任何与它们相关的信息.
解决方法:
对于第一段代码:
查看您的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参数指定的类型.