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

Java 如何通过Jersey2.0或更高版本创建RESTful web服务客户端,java,rest,jersey,jax-rs,jersey-2.0,Java,Rest,Jersey,Jax Rs,Jersey 2.0,通过Jersey 1.x创建RESTful客户端的例子似乎很多,但Jersey 2.0或更高版本的例子不多。 我提到了其他问题和Jersey的网站,但由于Jersey 2.0和上一个版本之间的差异,我仍然无法创建REST客户端。 所以我想问一些建议 到目前为止,我的编码是这样的 ClientConfig config = new ClientConfig(); Client client = ClientBuilder.newClient(config); WebTarget target =

通过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方法具有@products({“application/xml”、“application/json”})。 所以我不明白为什么上面的编码会在Java应用程序上产生406错误

(即客户端有如下@GET方法)

@GET
@路径(“{id}”)
@产生({“application/xml”、“application/json”})
公共客户查找(@PathParam(“id”)整数id){
返回super.find(id);
}
@得到
@凌驾
@产生({“应用程序/xml”})
公共列表findAll(){
返回super.findAll();
}
你们中有谁知道我做错了什么,或者你们能推荐一个RESTful客户的例子吗? 任何建议都会很有帮助…提前谢谢


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

第一段代码:

查看您的
request()
方法
target.request(MediaType.TEXT\u XML\u TYPE)
。来自if状态的Javadoc

Invocation.Builder请求(MediaType…AcceptedResponseType)

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

webTarget.request().accept(类型)

所以基本上,在您的请求中,您是说您将只接受:text/plain
。现在看看您的资源方法。请看
@生成的
。它们都不会“生成”
text/plain
。都是json或xml。这就是为什么你会有例外。在客户端将accept更改为
application/xml
(或
MediaType.application\u xml
),您将不会再收到此错误

关于第二个问题:我想你的意思是,当你从浏览器测试它时,它为什么会工作

如果您只需键入url即可从浏览器发送请求,那么它将以多种
Accept
类型发送请求。如果您有firebug(用于FireFox)或开发者工具(用于Chrome),如果您发送请求,您将看到类似的标题

Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
您可以在那里看到
application/xml
。即使
application/xml
不存在,通配符
*/*
也存在,因此在浏览器中工作时,基本上几乎所有媒体类型都可以接受为返回类型

最后一个问题:

查看的API,它扩展自。您将看到不同的重载
put
post
方法,如您所述,大多数方法都接受
实体

有几种不同的方法可以构建一个应用程序,所有这些方法都使用一种静态方法。这里有一些

  • 实体。实体(主体,mediaType)
  • json(主体)
  • xml(正文)
还有更多(参见上面的实体链接)。但是所有这些静态方法都返回一个
实体
。所以我们可以做一些类似的事情

// 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
is,则会被转换为json,但是您需要确保您具有json提供程序依赖项。默认情况下,Jersey不会附带一个。更多信息请访问



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

非常感谢您的建议。现在我能理解它产生了什么406。你能告诉我更多关于你建议的最后两行吗?我试图通过导入“customerEnd.Customer;”来使用“Customer”类。这是一个在服务器端制作的包,包含“Customer”类。导入此包不会产生任何错误,可能是因为我将服务器端类的WAR文件添加到此客户端。但是,在我构建项目之后,它会产生错误。有必要使用这个类,所以你看到我导入这个包需要做什么吗?你的
@Path
@Path(“{id}”)
。在这个方法中,您需要获取id的路径段值。我要说的是requestio uri应该以该id结尾,以便您能够在该方法中使用它。像
http://..../customers/1
,其中
1
将是传递给该方法的id。至于您的第二条注释。我真的不明白问题出在哪里。我不知道错误是什么,所以我不知道该告诉你什么。我能确认你说的“域”是什么意思吗?“entity.xml()”中应该有一个实体,但老实说,我并不确定实体是什么。根据链接,它“封装了消息实体”。那么,在这种情况下,它是客户的目标吗?
// 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));