php - 为新的 Api 使用 SOAP 或 REST

标签 php api rest soap

<分区>

(不是 Should i use rest or soap 的副本。该问题只有 1 个答案,除了开销之外没有提供很多参数)。

在将此问题标记为重复之前,请考虑一下我正在寻找在我之前做出选择并根据自己的经验解释原因的人的答案。简单说明“开销”或“更复杂”的答案不符合该要求。

现在是问题:

不久前,我开始使用 Soap(PHP/Zend_Soap_Server、Zend_Soap_Autodiscover)设置一个新的 api。虽然我已经弄清楚了如何使用 soap,但它的复杂性让我怀疑这是否是 future 维护的好选择。

我听说过 REST,但没有任何经验。

所以问题是:REST 与 SOAP 的优缺点是什么?在创建全新的 api(相当复杂的 api,几十种方法,使用 ssl,必须具有良好的安全性等)时,您有什么建议,REST或 SOAP 。

如果您认为您的答案在 REST 和 SOAP 之间悬而未决,并且特定的依赖项或功能会打破平衡,请务必询问您需要知道的任何内容。我会尽快回答。

API 功能的简短列表:

  • 身份验证
  • 为前端执行数学函数
  • 向前端提供二进制文件(发票)
  • 各种信息的基本CRUD

api的地方基本如下:

互联网 -> 网站 -> [内部网络] -> API/后端 -> 数据库

提前感谢您的时间..

最佳答案

这当然是一个非常有争议的话题,但与此同时,出于多种原因,大多数新服务都是 REST 的。我不会介绍两者之间的区别(因为有据可查),但更多的是我认为您今天(2012 年)使用 REST 构建新服务的原因:

  • REST 更简单,基本上只是构建在 HTTP 之上
  • 您可以使用网络浏览器或类似 curl 或 httpie 的工具测试(和调试)REST 服务.是的,这在技术上也可以通过 SOAP 实现,但您必须对 SOAP 架构有所了解。
  • 同样,只要有办法访问 HTTP,就可以构建 REST 客户端。 SOAP 需要支持 SOAP 的库
  • REST 更像是一种风格,建立在 HTTP 之上,而 SOAP 是建立在 HTTP 之上的整个协议(protocol)(它也是一种协议(protocol))
  • SOAP 以疯狂的扩展协议(protocol)结束,例如 WS-Security、WS-Encryption(从本质上讲,它们是由委员会设计的非常复杂的解决方案,用于解决几十年前 Internet 的其他部分为 HTTP 解决的问题)

如果您环顾互联网上的一些主要 API(例如 Google、Facebook、Twitter 等),您会发现很多 REST,而几乎没有 SOAP。那些确实有 SOAP 接口(interface)的人正在弃用或完全放弃它们,因为没有什么理由再坚持使用它了。

事实上,许多大型服务更进一步,只提供 JSON 格式的 REST 服务,而不是 XML 或两者兼而有之,因为与 SOAP 上的 REST 一样,JSON 在大小和XML 的简单性表明继续支持 XML 没有多大意义。


与 SOAP 相比,REST 也几乎没有缺点。

我能想到的唯一实际考虑是从客户的角度来看。使用 SOAP(由于 WSDL,假设您生成了一个),您可以将支持 SOAP 的 IDE 指向服务(例如 VisualStudio),它将生成基于远程服务的 native 客户端代理 API。这在快速启动和运行方面有点不错,但有其自身的一系列缺点:它迫使您使用服务中定义的对象(而对于 REST,您可以使用自己的对象定义,只要数据映射in),并且取决于远程服务如何处理版本控制(或不处理版本控制)以及您如何使用它,您可能最终不得不更新应用程序的主要部分,因为像命名更改这样简单的事情。

从服务器的角度来看,我真的看不出选择 SOAP 而不是 REST 有任何技术优势。

TL;DR:SOAP 不一定不好,只是 REST 更好。

关于php - 为新的 Api 使用 SOAP 或 REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842163/

相关文章:

Restful API 命名约定

php - 有大循环的空白页

php - CakePHP 允许使用 API 按字段搜索吗?

spring - 构建可扩展的 Spring MVC 应用程序

java - 从服务器端 API 重定向时,Safari Angular URL 参数被忽略

c# - 如何获取 Web API IHttpActionResult 响应并序列化 c#

java - Spring Boot 请求头返回空值

PHP > 使用 time() 检查是否已经过了整整 24 小时;

php - 使用 SSL 后我需要向 PHP 添加任何代码吗

c++ - 检测屏幕上的坐标是否可交互。