我和一位同事讨论过,他真的很喜欢 REST,但我仍然必须相信它的好处。
我的主要问题是,从消费应用程序的角度来看,我并没有真正将 REST 视为 API 或一般接口。让我详细说明。我们有两个应用程序,其中一个使用 RESTful API 调用另一个。这是使用 JAX-RS 和 RESTeasy 实现的。但是,使用 RESTeasy,基于接口生成 REST 客户端也非常简单。
假设这是一个处理书籍和作者的系统。应用程序需要知道一本书,让我们假设它已经知道一些 ID。
- 在 REST 中,它会调用例如
http://server/book/21
,返回任意有效负载并将其反序列化为Book
对象。 - 使用 RESTeasy 客户端,我们有一个
BookService
带有方法的接口Book getBook(int bookId)
,我们只需调用getBook(21)
并返回一个Book
对象。
我要说明的一点是,这BookService
是一个定义明确的接口,您(作为程序员)可以很容易地看到它期望的参数是一个标识符,它将返回一个Book
对象。使用“just REST”,我们访问一些 URL,我们得到返回的任意数据。没有明确定义的接口,如果不知道来自服务器的内部 URL 信息,您不知道如何构建 URL,您必须“手动”解析 XML(希望使用 XSD)。
另一件事。我提到了书籍和作者。
使用接口时,您可以只有一个BookService
返回Book
s 和一个AuthorService
返回Author
s。ABook
可以有一个属性authorId
,您可以Author
通过调用Author getAuthor(int authorId)
.
使用 REST 时,您调用图书 URL 并返回有关作者的一些信息,包括作者的链接。然后,您可以点击链接以获取有关作者的更多信息。但是你怎么知道在哪里可以找到这个链接呢?并且出现了与之前相同的问题:如何构建链接,我如何知道如何解析返回数据?
当将两者混合时,可能会发生奇怪的事情。如果我只想Book
通过 id 获取,我可能会调用BookService
(它在内部以任何方式转换为 REST 调用)并获得一个不错的Book
对象。但是,如果我想获取作者信息,我有 this String authorLink
,我必须按照它来获取我的Author
对象。但相反,当我的起点是 anAuthor
并使用 检索它时AuthorService
,我会在指向书籍对象的字符串 (URL) 集合中获得作者所写书籍的链接。
那么为什么 REST 被认为是一种 API?为什么我应该更喜欢 REST 而不是定义明确的 (Java) 接口?以及如何将两者混合?