1

我正在使用带有 RESTEasy 的 Java 和 JBoss7。我创建了我的 RESTful 服务和一个客户端来测试我的服务:

ClientRequest request = new ClientRequest(
         "http://localhost:8080/test/rest/cars");
request.accept(MediaType.APPLICATION_XML);

String input = "<car><carId>10.99</carId><carName>Ford</carName></car>";

request.body(MediaType.APPLICATION_XML, input);
ClientResponse<String> response = request.post(String.class);
System.out.println("Output from Server .... \n");
System.out.println(response.getStatus());

这完美!这里唯一的问题是在客户端。我必须像你看到的那样发送硬编码的 XML,String input = "<car><carId>10.99</carId><carName>Ford</carName></car>";因为客户端没有我拥有的对象。

客户端将模仿它从 get 方法接收到的 XML 表示,这对于庞大而复杂的资源可能很难做到。

  • 有没有办法让客户端知道他们想要发送的对象的正确结构,或者他们必须发送类型化的 XML?

  • 我可以给客户端一些类似于 WSDL 或 XSD 的东西,或者这会违反 REST 的约束吗?

  • 我见过人们会使用 Xsteam 和 unmarshalling 的解决方案,但他们假设客户端具有资源的类表示。

4

1 回答 1

1

不要在客户端代码中硬编码 XML 消息。XML 是在服务和客户端之间传递的内容。

让我们假设一种情况,您将相同的服务暴露在不同的位置,其中一个只理解 XML 格式,而另一个只理解 JSON。如果您要使用带有硬编码消息的客户端,您将只能调用与 XML 对话的服务。记住 REST 是关于资源的表示。

因为客户没有我拥有的对象。客户端将模仿他从 get 方法接收到的 XML 表示,这对于庞大而复杂的资源可能很难做到。

有没有办法让客户端知道他们想要发送的对象的正确结构,或者他们必须发送类型化的 XML?

考虑您的客户端是一个通常与对象一起工作的 Java 应用程序。对象代表资源(例如car),这就是您的客户在内部使用的。

当需要调用服务时,您只需将这些对象编组为 XML。当服务响应时,您将 XML 解组为对象。

根据使用的AcceptContent-Type标头,只需选择适当的编组器/解组器即可。然后,您甚至可以将某些内容作为 XML 发送并作为 JSON 接收回来。

当然,RESTeasy 客户端可以使用与服务端相同的注解,甚至可以在服务和客户端之间重用一些 Java 类型(类),但是当客户端使用其他技术编写时,这些 Java 类将变得无用: C#, Python, C++ 等

为什么客户应该关心服务使用的类型?它应该只关心表示。在内部,客户端可以使用它想要的任何类型(独立于服务),并在需要与服务交谈时与适当的表示进行通信。

我可以给客户一些类似于 WSDL 或 xsd 的东西,或者这会违反 REST 的约束吗?

这有点棘手。

REST 是一种用于构建分布式系统的软件架构风格。不幸的是,不同的人对这种“风格”的理解不同,因此存在大量所谓的 RESTful API,它们简单地描述了使用什么方法、在什么 URL 上以及向前发送回什么“类型”。

正如 Roy T. Fielding 自己所强调的那样,这是执行 REST 的错误方式:REST API 必须是超文本驱动的

RESTful 客户端不需要事先了解要访问的 URL 或用于通信的“类型”。了解交换中使用的媒体类型就是它所需要的(我不是在谈论application/xml它只是说明了消息的格式,没有语义或内部内容的描述)。

因此,为什么服务要提供 WSDL?实际上(虽然 WSDL 2.0 可以描述 RESTful 服务)它实际上是我们正在谈论的WADL 。但是 REST 社区实际上并没有考虑到 WADL,所以这也是“风格”的问题

如果您正在“按书”执行 REST,则不需要 WADL。如果您实际上只有一个基于 HTTP 的接口,我假设您可以提供一个 WADL 来简化其他程序员在开发客户端时的生活。

我见过人们会使用 Xsteam 和 unmarshalling 的解决方案,但他们假设客户端具有资源的类表示。

RESTeasy 支持 JAXB 编组,因此应该不费吹灰之力。

于 2013-02-16T18:16:43.873 回答