繁体   English   中英

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

[英]How to create RESTful web service client by Jersey2.0 or above

似乎有很多关于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号(即整数值)。 但是,似乎我需要将“Class”和/或“Entity”值设置为参数,但我在Jersey网站上看不到与它们相关的任何信息。

对于第一个代码块:

406表示不可接受

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

Invocation.Builder request(MediaType... acceptedResponseTypes)

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

webTarget.request().accept(types);

所以基本上,在你的请求中,你说你只会Accept: text/plain 现在看看你的资源方法。 看看@Produces 他们都没有“产生” text/plain 这都是json或xml。 这就是你得到例外的原因。 在客户端将accept更改为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不存在,外卡*/*也存在,因此在浏览器中工作时基本上几乎所有媒体类型都可以作为返回类型。

对于你的上一个问题:

查看Invocation.Builder扩展自的SyncInvoker API。 您将看到不同的重载putpost方法,其中大部分都是如您所提到的那样接受Entity

构建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));

在内部, Customer将转换为XML。 如果您使用Entity.json将转换为JSON, 您需要确保您具有JSON提供程序依赖项。 泽西岛默认不会带一个。 有关常见媒体类型表示的更多信息,请参阅


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM