最好的SOAP / REST / RPC Web API的例子? 你为什么喜欢他们? 他们有什么问题?

在我的公司,我们开始分支到Web API来访问和更新我们的数据; 最初是为了合作伙伴,但随后可能会在公众面前。 目前,API的外观(如SOAP,REST,RPC)完全开放,我们还没有做出任何决定,所以我对两个人们认为是好的Web API的例子感兴趣,为什么你认为那。

我感兴趣的是使用不同语言(我们可能会向使用多种平台的用户提供API,特别是.NET,Java,ActionScript和JavaScript)提供关于您认为很好的Web API的意见例子,而且你有很好的经验。

我想说的一些观点:

  1. 你喜欢SOAPtypes的服务还是REST / RPCtypes的服务? 我怀疑有平台支持的人(比如.NET,Java)会更喜欢SOAP,而使用没有平台支持的语言的人会更喜欢其他人,但是我想validation这个假设。

  2. 你关心一个API是否实际上是RESTful,还是它是一个普通的RPC样式的HTTP GET / POST? 如果是这样,你为什么在意? API是否正确地描述了它本身(比如说,如果它是RPC风格,不要说是REST风格)比它实际上是否是其中之一更重要?

  3. 我们需要validation谁在使用该服务。 我一直在看亚马逊S3authentication,它使用公共标识符和用于将请求的参数散列到validation令牌中的私有令牌(这也类似于flickr)。 您之前是否使用过这种authentication方式?您是如何继续使用它的? 有没有你发现的哈希algorithm有问题(即不支持你的平台)? 你希望发送一个HTTP头或在URI的哈希?

  4. 如何处理版本控制? 有一个/v1/ type子目录是否是一个好主意,以便将来的版本可以一起添加,或者你会做一些不同的东西,如请求有效载荷或查询中的版本? 多长时间,你会期望一个你所build立的API版本被支持(即如果v2被引入,你期望在v1的生命周期)。

此外,任何其他意见和要点,将是有益的。

我故意对我们正在实施的API的实际types保持模糊,因为我正在寻找关于人们认为是好的API和实现机制的一般指导,所以这篇文章及其答案将对更多的人有用在将来。


注意:我已经search了,并且找不到关于这个的一个通用的问题 – 它们似乎都是特定于某种types的API – 但是如果它是重复的,请让我知道。 此外,如果它应该是社区维基(我认为人们应该得到的答案,所以我没有做到一个),那么请让我知道,我会改变它。

这是我的要求

  1. 虽然来自Java的立场,但我更喜欢REST。 具有多个名称空间的SOAP信封及其复杂的结构是可憎的。 它试图解决主要是想象中的问题,并没有有效地解决任何事情。 只有SOAP我发现有用的是它有授权和错误的标准。 另一方面,通过在根XML元素中包括四个标准属性 – 用户名,密码,errorCode,errorDescription,可以更容易地解决这两个问题。

  2. 好的API描述和文档确实是重要的。 成熟框架中REST和SOAP之间的区别主要在于几行configuration。

  3. 对于SOAP,发送散列作为SOAP安全性的一部分; 对于REST,我喜欢将所有内容打包到payload中,并避免使用HTTP头进行身份validation。 我只有主观原因,因为我不得不与不容易暴露HTTP标头的框架争斗。

  4. 我个人的偏好是不同的协议版本的URI。 根据我的经验,这为新版本提供了更大的灵活性,连接到不受支持的协议版本的旧客户端立即停止工作,原因很明显。 此外,有时您可以将旧版本的应用程序映射到旧的URI,以避免在新的服务器版本中使用旧的支持代码。

    至于多长时间支持旧版协议…理想情况下,只要你有客户使用它。 这比技术决定更重要。 您应该至less支持一个以前的协议版本。 将客户推向新版本通常有利于降低传统支持成本; 从客户端来说,新版本应该意味着新function,更好的协议,以及某种额外的业务激励(如果新function本身是不够的)。

您可能会对Joshua Bloch的演讲“如何devise一个好的API及其重要性”感兴趣。 Joshua Bloch是“Effective Java”的作者,也是Google的首席软件工程师和首席Java架构师。

摘要: http : //portal.acm.org/citation.cfm?id=1176622

幻灯片: http : //lcsd05.cs.tamu.edu/slides/keynote.pdf

video: http : //www.youtube.com/watch?v = aAb7hSCtvGw

使用Content-Type标头进行REST的版本化在这里有很好的介绍: http : //barelyenough.org/blog/2008/05/versioning-rest-web-services/

RPC方法也是一个不错的select。 它减less了开销,像Ice,Google Protocol Buffers和Apache Thrift这样的项目可以更容易地开发基于RPC的服务。

如果您不必提供基于Web的API,那么RPC也可以作为您想要探索的select。

我会看到亚马逊在做什么 – http://aws.amazon.com/ – 从这个东西赚钱的家伙显然会比其他人学到更多的教训。

其他API我会看 – salesforce.com和微软CRM CRM API是相当有趣的。 Twitter也有一个强化的REST API。

恕我直言,这一切都取决于你提供什么样的应用程序。 如果您正在进行重要的大事务处理,那么一定要使用SOAP(WS称之为“死亡之星”)。 但是,如果您提供的是社交应用,那么请使用REST,因为它更简单,更适合公共黑客行为。

REST,如果做得正确的话,很容易理解(模型HTTP),简单明了(面向资源),几乎所有的编程语言(XML)都可以被parsing。

如果你最终无法下定决心,那么你可以全部实施。 在这些情况下,看看其他人如何做到这一点是有用的。 我build议你开源的XML本地数据库eXist ,它提供了三种types的接口