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