2012-09-17 88 views
4

我和一位同事讨论过,他真的很喜欢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)接口?我如何混合两者?

+0

那你最终会一起去? – bryanmac

回答

2

在您选择的搜索引擎上检出Hypermedia APIs

有一些很好的文献,将解释你如何“知道”什么要调用什么请求。特别是HATEOS

为何选择超媒体API? REST是一个相当宽松和淡化的术语。通常执行不正确。最近有一股潮流来试图澄清这种混乱,因此是“新”术语。如果正确完成,您将获得REST(参见超媒体API)服务的强大功能,您可以使用Java/.NET中使用强类型化服务(ala SOAP,RPC)的熟悉样式界面来访问

+0

+1 - 关于超媒体的后续阅读(后续文章到这一篇):http://blog.steveklabnik.com/posts/2011-07-03-nobody-understands-rest-or-http – bryanmac

+0

其他链接:http: //blog.steveklabnik.com/posts/2012-02-23-rest-is-over – bryanmac

+0

@bryanmac Steve的东西非常值得一读。很好也跟随在twitter上链接到其他人做的东西。 – Finglas

0

REST不是一个API,而是更多的架构。 REST用于通过现有的HTTP协议在2个不同的系统之间进行通信。 REST对很多事情都很有意义,也许在你的情况下你不需要使用它。

2

没有人按照Roy Fielding的设想使用REST,无论出于何种原因。所以这是不切实际的。对于懒惰的人来说,这足以不必考虑它。

显然这个行业很痴迷于为RPC创造不同的名字。

0

简而言之,REST API对于其他编程语言是灵活的。

我不熟悉RESTEasy,但熟悉RESTful服务。 REST没有标准。大多数REST服务发布如何与其REST API进行交互。哪些URL(资源)可用,要发送的内容类型以及将返回的类型。好的也会发布返回的http状态码以及如何处理错误。在你的情况下,我想知道REST Easy客户端在做什么。它只是将API调用转换为HTTP请求并处理开发人员的一切?

我们记录了我们的REST API调用并提供了包含所有模型的jar文件。模型使用JAXB注释,因此开发人员不需要知道从服务返回的XML或JSON的所有信息。那就是如果他们使用Java和我们的模型。发布和记录API的好处在于,其他语言的开发人员可以使用提供HTTP请求的服务。这使得开发人员可以用几乎所有的编程语言开发客户端应用(最近似乎是更多的C#实现)。

除了提供模型的jar文件之外,我们在非Java开发人员的文档中提供了XSD。

0

如果您考虑关于构建分布式应用程序/系统的工具的REST(体系结构而非设计或编码风格),而不是使用众所周知的且经过验证的概念(在万维网上)管理应用程序状态的主要意图,感觉在某些情况下使用它。

当您想要将某些处理/计算从一个应用程序移动到某个远程主机时(例如,检索书籍列表),您可以通过将您的方法调用(GetBooks)序列化为SOAP消息来完成该操作,然后将该消息添加到HTTP请求等。或者你可以直接调用GET/books。在某些情况下,使用第二种方法要便宜得多。 如果我提到资源缓存是基础设施的一部分,而不是显式实现的资源缓存或灵活性,当您需要相同资源的不同表示时,它甚至会更有意义。

如果某些服务使用REST风格并仔细编写(与任何API类似),则易于理解和使用。这些类型的服务也可以很容易地从不同类型的客户端(javascript,php,..)中消费,其中没有像JAX-WS或WCF这样的框架。

为简化起见,您可以将REST服务视为书架,从中可以获得一些书籍(资源),您可以在其中发布新书或放置一本书。如果每个资源在问题域方面都有意义,并且资源表示包含指向相关资源的链接,那么我不会看到理解/使用它的问题。

0

你误会REST的重要组成部分。在精心设计的RESTful系统中,有两两件事必须非常有据可查:

  1. 的入口点(或“酷”的URI),您使用开始与系统的有效载荷数据交互
  2. 架构请求中发送并在响应中返回(HTTP术语,这些都是媒体类型)

给我只是这两件事情,我将能够建立一个客户到您的RESTful API。从#1开始,使用#2的知识来找到我的系统API“超链接”的方法,我将能够找到我需要的资源。

了解您系统的Book表示形式将允许我进行GET调用以检索并理解它,或者创建一个POST或PUT调用。 HTTP支持那些开箱即用的动词,我只需要知道通过线路发送了什么(并且#2告诉了我)。

如果我不喜欢XML,我可以尝试要求服务器,如果我能代替说话JSON和HTTP支持那种内容协商的开箱即用。

REST是不是独角兽作出魔仙尘,也不会仅仅凭借所使用的解决您的问题。然而,它却是一种常识性的架构,它试图利用现有的久经考验,易于理解,可扩展和灵活的技术和方法。

0

ReST是一种架构风格,而不是一个API。

一些优势你开始使用REST

  1. 多重响应型能力(例如:JSON,XML)作息不绑定到XML像SOAP
  2. 使用JSON,使你的体重负荷轻,你的服务速度更快
  3. 更轻松地开发和测试
  4. 其余部分使用普通HTTP,所以没有代理相关的问题

关于服务定义,你可以为你的REST服务,以查看完整的选项生成的wadl文件。大多数服务器自动生成这些。这些服务需要记录在SOAP或ReST中。你可以检查LinkedIn ReST API

我看到的SOAP的唯一优点是SOAP可以提供的安全功能。但并非所有的应用都需要这种安全级别。