如何最好地提供SOAP/XML + REST/JSON?

3
我正在创建一个通用的 Web 服务,可能会有许多不同的客户端,其中一些我现在无法预测。
我已经拥有了一个不错的 Java 服务 API,并希望在其上提供 Web 服务外观。
SOAP vs REST 的争论存在很好的论点,这让我想知道是否有一种简单的方法可以同时提供两者? 不一定是在同一时间为同一部署(尽管那可能很好)...而是向客户提供选择。
5个回答

3

是的,您可以同时提供两种格式(我建议这样做)。您可以根据HTTP Accept头部(application/soap+xml vs. application/json)或自定义查询参数(例如http://example.com/myapi?fmt=soap vs. http://example.com/myapi?fmt=json)来决定响应的格式。无论如何,如果客户端没有明确指定所需的响应格式,则需要有清晰的默认回退值。

您还可以考虑添加REST/POX响应格式,将Atom+可选扩展作为响应容器。(对于上述两种方法,application/atom+xmlhttp://example.com/myapi?fmt=atom


我还是一个 Web 服务新手,所以能否请您解释一下?您是说可以通过使用 HTTP 接受头来区分调用者想要返回的内容,从而同时提供 SOAP/XML、SOAP/JSON、REST/JSOM 和 REST/POX 吗?如何实现这一点?有哪些工具和框架支持这种方式? - Dave
是的,你理解得没错。这只是将 Web 服务响应适当序列化为客户端能够理解的格式的问题。(顺便说一句,SOAP/JSON 这种东西并不存在。:-)) - Franci Penov
我不知道有哪些Java Web服务框架支持响应格式切换,但我想任何现代Web服务框架都应该支持它。如果您提供您使用的特定框架的一些详细信息,我相信人们将能够告诉您如何在其中实现它。 - Franci Penov
我还没有使用其中任何一个,只是试图找出在选择一个时哪些标准很重要。其他人向我推荐了CXF。它能支持这个吗? - Dave
我没有使用过它,但根据http://cxf.apache.org的说明,CXF支持SOAP和REST/HTTP绑定以及XML、JSON和FastInforset消息格式。 - Franci Penov

3
没有。SOAP和REST是两种完全不同的架构,任何声称可以轻松实现两者的框架都可能在其中一项工作上表现不佳。虽然很容易通过WSDL文件、SOAP端点等获取一组函数或方法,但这是因为函数和SOAP基本上执行相同的操作,没有任何约束。调用者设置一个带有多个参数的函数调用,触发它并(通常)等待响应或异常。
为每个方法创建HTTP端点是一些人认为足以创建RESTful端点的做法,但事实并非如此。不过,如果这样做对您有意义,那么您应该继续寻找提供此功能的框架。
我的回答之所以以“没有”开始,是因为要创建REST接口,仅发布HTTP端点是不够的,您需要做更多的工作:
- 查找可重用的媒体类型 - 查找可重用的链接关系 - 设计自己的媒体类型 - 定义自己的链接关系
世界上没有任何框架能够接受任意函数签名列表并为您完成这四件事。框架允许您利用比SOAP更多的HTTP功能(例如OAuth、OpenID、缓存、幂等性),但它们无法帮您完全实现REST。

2
简而言之,单个WCF服务可以为同一服务合同提供多个端点。其中一个可以是REST,一个可以是SOAP/XML,还可以是TCP/IP+二进制格式。

这是否专门适用于WCF?我之前没有提到它,因为我认为这不应该有影响,但该应用程序是作为Java servlet实现的。 - Dave
是的,这是特指WCF。如果你的平台是Java,你应该将其添加到你的标签中。 - John Saunders

1

我并不是很热衷于SOAP Web服务,但在Google搜索中,我发现Apache的Axis 2框架不仅提供了SOAP 1.1和SOAP 1.2,而且还提供了与相同业务逻辑实现的REST/POX。您可以查看更多信息:

http://ws.apache.org/axis2/


-1
我会坚持使用简单的REST解决方案。亚马逊为相同的服务提供了REST和SOAP API,而REST服务在85%的情况下被使用,因此如果您没有特定需要使用SOAP,则不建议实施它。

这是客户的要求,因为这个系统将成为更大的SOA战略的一部分。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接