【发布时间】:2010-01-13 21:00:03
【问题描述】:
我看到 PayPal 等 API 提供使用 NVP 或 SOAP/WSDL 调用他们的服务。在使用传统 Web 服务(无 WCF)的 .NET 环境(3.5)时,哪个更好,为什么?我知道 WSDL 允许您插入 API URL 并为您生成包装器。那么为什么公司还要提供 NVP 呢?
【问题讨论】:
标签: web-services rest soap wsdl asmx
我看到 PayPal 等 API 提供使用 NVP 或 SOAP/WSDL 调用他们的服务。在使用传统 Web 服务(无 WCF)的 .NET 环境(3.5)时,哪个更好,为什么?我知道 WSDL 允许您插入 API URL 并为您生成包装器。那么为什么公司还要提供 NVP 呢?
【问题讨论】:
标签: web-services rest soap wsdl asmx
这个行业似乎对不同类型的 Web 服务存在永无止境的困惑。
SOAP 是一种消息传递协议。它与 REST 的共同点就像苹果与草坪拖拉机的共同点一样。您希望消息协议中的一些内容是:
...等等。这不是一个详尽的清单。 WSDL 为 SOAP 添加的主要内容是:
通过合约的可发现性,这是一种机器可读的“文档”形式,可以准确地告诉消费者发送消息所需的内容,并允许自动生成代理;
对消息进行严格的自动架构验证,与 XSD 对 XML 的工作方式相同。
REST 不是一种消息传递协议。 REST 是一个由资源和动作组成的系统。出于其他答案所述的几个重要原因,对于许多架构来说,它是一个可靠的选择。它也与 PayPal 和 flickr 等“NVP”服务几乎没有关系。
PayPal 的 NVP API 不是 REST。对于不支持或难以支持 SOAP 的客户端,它是一种替代的、类似 RPC 的 HTTP POST 消息传递协议。这不是我的观点,这是事实陈述。 NVP 中的字段之一实际上是METHOD。这显然是 RPC 用语。看看他们的UpdateRecurringPaymentsProfile 的 API 并尝试告诉我,将其描述为“资源”是有道理的。这不是资源,而是操作。
就 PayPal 而言,“NVP”(HTTP POST) API 在几乎所有方面都不如 SOAP API。它适用于无法使用 SOAP 的消费者。如果你可以使用它,你肯定应该。
我也不一定为此抨击 PayPal。我知道很多人因为没有将“适当的” RESTful API 放在一起而抨击他们,但这不是我想要的。并非世界上的每一项服务都可以用 REST 准确描述。 PayPal 并不是真正的基于资源的系统,它是一个事务性 系统,所以我可以原谅他们的架构师和开发人员没有完美优雅的 REST 架构。这也许值得商榷,但不是非黑即白。没关系;如果需要,我将只使用 SOAP 系统。
将此与Twitter API 进行比较。这是一个真正的 REST 服务。您可以在此 API 上执行的每个“操作”都准确地描述为检索或提交特定类型的资源。资源是推文、状态、用户。在这种情况下,使用复杂的 SOAP API 从字面上看是没有意义的,因为您并没有真正发送消息,您没有执行事务,您只是在请求具体的事物,而这些事物可以用一个URL来描述。唯一的区别是,您获取的不是 HTML 网页,而是一些 XML 或 JSON 数据;你请求的方式完全一样。
REST Web 服务通常(总是?)使用 HTTP GET 来检索某些资源。而 Twitter 正是这样做的。 GET 仍然使用“名称-值对”——即查询字符串 ?q=twitterapi&show_user=true。 ? 之后的那些位是名称-值对。这是一个很好的例子,说明了为什么要在 SOAP 上使用 REST;您可以将其连接到 RSS 提要并获取流式更新。我可以把它变成 Firefox 中的实时书签。或者我可以以 JSON 格式下载它并将其绑定到 jqGrid 之类的东西上。有趣的不是请求使用“名称-值对”;有趣的是,它是一个简单的 URL,任何知道如何请求网页的人都可以使用它。
所以要尝试总结我所说的所有内容,请这样想:
当您想要将数据公开、使用或发布为永久资源时,请使用 REST API(如果可用)。
当系统本质上是事务性的和/或当您需要复杂消息传递协议可以提供的高级功能(例如 RM 和寻址)时,请使用 SOAP API。
在没有 SOAP API 或无法使用 SOAP API 时使用 RPC API(包括几乎所有完全围绕 HTTP POST 建模的 API)。
希望这能消除一些困惑。
【讨论】:
我假设您所说的名称值对是指 REST 服务。
REST 的好处主要是易于开发、简单和优雅,以及较低的开销(如果您要发送和接收大量小消息,这一点非常重要)。
以下是 REST 的一些优点:
【讨论】:
NVP 是 HTTP POST
name=fred
amount=100
code=403
等
这是任何 HTML 浏览器的默认格式,因此很容易实现将数据发送到 Web 服务
我认为这不是从 Web 服务接收数据的好格式吗? JSON 或 XML 会更合适
没有人使用 VisualStudio,或者可以访问自动包装器生成器,或者想要使用这样的野兽
许多 Web 混搭都是用 Javascript 编码的,因此使用 HTTP POST 发送数据是最简单的方法。返回结果是标准的 HTML 响应代码(200、403、500 等)和/或一些 JSON
许多服务提供商提供多种 API 来满足所有客户的需求
【讨论】: