JAX-RS非常适合实现REST。在Java中,您使用什么来调用REST服务?

JAX-RS非常适合实现REST。在Java中,您使用什么来调用REST服务?,java,rest,client,jax-rs,Java,Rest,Client,Jax Rs,理想情况下,我正在寻找类似JAX-RS的东西(使用注释来描述我想要调用的服务),但允许调用使用其他技术(而不是JAX-RS)实现的REST服务。有什么建议吗?主要来自apache的HttpClient(请参阅)。我建议您看看。WADL是休息,就像肥皂一样 首先需要使用WADL定义REST接口。然后可以在其上运行wadl2java工具,为REST调用生成客户机存根 一旦您拥有了web服务的WADL,您就可以实现一些工具,这些工具也可以用它做其他事情,例如生成服务器端存根、生成文档等。JAX-RS(

理想情况下,我正在寻找类似JAX-RS的东西(使用注释来描述我想要调用的服务),但允许调用使用其他技术(而不是JAX-RS)实现的REST服务。有什么建议吗?

主要来自apache的HttpClient(请参阅)。

我建议您看看。WADL是休息,就像肥皂一样

首先需要使用WADL定义REST接口。然后可以在其上运行wadl2java工具,为REST调用生成客户机存根

一旦您拥有了web服务的WADL,您就可以实现一些工具,这些工具也可以用它做其他事情,例如生成服务器端存根、生成文档等。

JAX-RS(JSR311)没有定义客户端API,但大多数JAX-RS实现都有一个,比如,或。 Restlet框架还有一个单独的


由于这些都是REST的专用库/框架,我建议您研究一下。

您在评论中写道,您“希望有比HttpClient更高层次的东西”。听起来好像很完美。它提供了用于实现和使用RESTful web应用程序的高级API,以及用于较低级别实现的即插即用适配器

例如,要使用Restlet 1.1将Web表单发布到资源,请执行以下操作:

Client client = new Client(Protocol.HTTP);

Form form = new Form();
form.add("foo", "bar");
form.add("abc", "123");

Response response = client.post("http://host/path/to/resource", form.getWebRepresentation())

if (response.getStatus().isError()) {
    // deal with the error
    return;
}

if (response.isEntityAvailable()) {
    System.out.println(response.getEntity().getText());
}
如果需要对请求设置更多选项,可以使用请求对象:

Form form = new Form();
form.add("foo", "bar");
form.add("abc", "123");

Request request = new Request(Method.POST, "http://host/path/to/resource");

request.setEntity(form.getWebRepresentation());

request.setReferrerRef("http://host/path/to/referrer");

Response response = client.handle(request);

正如甘道夫和达雷尔·米勒所说,HttpClient

您不需要从HTTP参数构造XML。XML应该只是两个独立系统之间的接口。使用HttpClient可以让您在Java中使用字符串值,从那个里返回XML是不必要的


如果此时要返回XML以发送到另一个系统,那么在与另一个系统通信之前,应该考虑将HTTP参数中的值移回域/应用程序逻辑。这对于保持应用程序逻辑与系统间通信的适当分离是必要的。

这是可行的,但我希望有更高级别的应用程序。您真的不需要更高级别的应用程序。只要您可以执行标准谓词,就可以确定响应的媒体类型并配置http头。客户端上的所有智能都应该用于封装媒体类型格式。你打算使用什么媒体类型?Darell,我想HttpClient没有做的主要部分是对“参数”进行XML序列化/反序列化。例如,从Java API中看起来很自然的参数到XML文档,反之亦然。我不明白。这里有qre查询字符串参数,我假设HttpClient可以很好地处理这些参数。有一些参数放在JAX-RS用URI模板解析出来的URL中,然后是发布的实体体,其中包含某种形式的媒体类型。您指的是什么XML参数?如果您试图使用一种方法在客户端上创建某种Java类,该方法看起来像是在服务器上执行RPC,那么您就有点达不到目的。Darell,假设您希望通过调用现有的REST API来更新员工记录,该API期望在/employees/123上放置一个JohnSmith文档(其中123是员工的ID)。您的Java API可能看起来像emp.update(“John”、“Smith”)在实现中,您需要创建XML文档并将其放到REST服务中。这更有意义吗?非常有趣。我一定会看一看。感谢您分享。这是一种保证在客户端和服务器之间创建耦合的方法,这正是REST试图避免的。忘记WADL,您必须Darrell,Gandalf,WADL有什么具体问题吗?在我的例子中,该服务已经使用另一种技术实现了,因此不会引入任何耦合。我想,任何想调用这些REST服务的人都会编写WADL描述,并根据该描述生成Java API来调用REST服务。alw作为客户端和服务器之间的耦合,WADL只是将其显式化。此外,大多数反对WADL的论点都假设客户端是在浏览器或其他动态语言中运行的javascript,而生成存根并没有提供太多价值。对于编译语言OTOH,它支持更好的工具(代码完成、intellisense等).然而,IMO WADL确实进入了有问题的领域(例如MIME类型描述)有一个原因,它还不是主流。我只是建议你看看它,看看它是否符合你的需求,或者至少提供一些想法。@ DSO,谢谢你的伟大建议。我会看看WADL,并把它看作是一个选项。这都是非常有用的。我刚刚在一个产品中使用了Restle客户机,发现API是N。ice和简明。我把它放在Apache HTTP客户端之上,还有其他可能使用的“客户端连接器”。由于Jax RS 2.0(Java EE 7),它提供了标准的客户端api。我支持上面的所有建议。我特别喜欢CXF客户端api。还请注意,Jax-RS 2.0将“很快”推出它将包括一个用于客户端的标准API,这是JSR339:因为Jax RS2.0(JavaEE7)提供了标准的客户端API。