【发布时间】:2010-06-22 00:38:55
【问题描述】:
我正在创建一个通用 Web 服务,它可能有许多不同的客户端,其中一些我目前无法预料。
我已经有了一个不错的 Java 服务 API,并希望在此基础上提供一个 Web 服务外观。
关于 SOAP 与 REST 辩论的双方都有很大的争论,这让我想知道是否有一种简单的方法可以同时提供两者?对于同一部署,不一定要同时进行(尽管这可能很好)...而是为客户提供选择。
【问题讨论】:
我正在创建一个通用 Web 服务,它可能有许多不同的客户端,其中一些我目前无法预料。
我已经有了一个不错的 Java 服务 API,并希望在此基础上提供一个 Web 服务外观。
关于 SOAP 与 REST 辩论的双方都有很大的争论,这让我想知道是否有一种简单的方法可以同时提供两者?对于同一部署,不一定要同时进行(尽管这可能很好)...而是为客户提供选择。
【问题讨论】:
不,没有。 SOAP 和 REST 是如此不同的架构,以至于任何声称可以轻松实现两者的框架都可能在其中一个方面做得不好。
虽然很容易将一组函数或方法获取到 WSDL 文件、SOAP 端点等,但这是因为函数和 SOAP 基本上都做同样的事情,对发生的事情没有任何限制。调用者使用多个参数设置函数调用,触发它并(通常)等待响应或异常。
有些人认为为每种方法创建 HTTP 端点就足以创建一个 RESTful 端点,但事实并非如此。但是,制作这样的 HTTP 端点对您来说可能仍然有意义,在这种情况下,您应该继续寻找提供此功能的框架。
我的回答以“不,没有”开头的原因是,为了制作一个 REST 接口,仅仅发布 HTTP 端点是不够的,你还需要做很多工作:
而且世界上没有任何框架会采用任意的函数签名列表并为您完成这四件事。框架允许您利用比 SOAP 更多的 HTTP(例如 OAuth、OpenID、缓存、幂等性),但它们不会带您一路 REST。
【讨论】:
是的,您可以同时提供(我建议您这样做)。您可以根据 HTTP Accept 标头(application/soap+xml 与 application/json)或自定义查询参数(例如 http://example.com/myapi?fmt=soap 与 http://example.com/myapi?fmt=json)来决定响应应采用哪种格式。在任何情况下,如果客户端没有明确指定所需的响应格式,您需要有明确的默认回退值。
您也可以考虑添加 REST/POX 响应格式,将 Atom+可选扩展作为您的响应容器。 (application/atom+xml 和http://example.com/myapi?fmt=atom 以上两种方法)
【讨论】:
简而言之,一个 WCF 服务可以为同一个服务合同提供多个端点。一种可以是REST,一种可以是SOAP/XML,一种可以是TCP/IP+binary。
【讨论】:
我不是很喜欢soap web 服务,但是在谷歌上搜索我发现来自apache 的Axis 2 框架不仅提供了SOAP 1.1 和SOAP 1.2,而且还提供了具有相同业务逻辑实现的REST/POX。您可以查看更多信息:
【讨论】:
我会坚持使用简单的 REST 解决方案。 Amazon 为相同的服务提供 REST 和 SOAP api,并且 85% 的时间都在使用 REST 服务,因此如果您对 SOAP 没有特定需求,那么我不会实施它。
【讨论】: