Java 提供SOAP/XML+;REST/JSON?

Java 提供SOAP/XML+;REST/JSON?,java,xml,json,rest,soap,Java,Xml,Json,Rest,Soap,我正在创建一个通用web服务,它可能有许多不同的客户机,其中一些客户机我目前无法预料 我已经有了一个很好的Java服务API,并希望在此基础上提供一个web服务外观 关于SOAP和REST的争论双方都有很大的争论,这让我想知道是否有一种简单的方法可以同时提供这两种功能?对于相同的部署,不一定同时提供这两种服务(尽管这可能很好)……而是为客户提供一种选择。是的,您可以同时提供这两种服务(我建议这样做)。您可以根据HTTP头(application/soap+xmlvs.application/js

我正在创建一个通用web服务,它可能有许多不同的客户机,其中一些客户机我目前无法预料

我已经有了一个很好的Java服务API,并希望在此基础上提供一个web服务外观

关于SOAP和REST的争论双方都有很大的争论,这让我想知道是否有一种简单的方法可以同时提供这两种功能?对于相同的部署,不一定同时提供这两种服务(尽管这可能很好)……而是为客户提供一种选择。

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


您也可以考虑添加REST /POX响应格式,Atom +可选扩展作为响应容器。(

application/atom+xml
http://example.com/myapi?fmt=atom
对于上述两种方法)

我坚持使用简单的REST解决方案。Amazon为相同的服务提供了REST和SOAP API,并且REST服务85%的时间都在使用,因此如果您对SOAP没有特定的需求,那么我不会实现它

简单地说,一个WCF服务可以为同一个服务契约提供多个端点。一个可以是REST,一个可以是SOAP/XML,一个可以是TCP/IP+二进制。

不,没有。SOAP和REST是如此不同的体系结构,以至于任何一个使两者都容易实现的框架都可能在其中一个方面做得不好

虽然很容易将一组函数或方法添加到WSDL文件、SOAP端点等中,但这是因为函数和SOAP基本上都做相同的事情,对发生的事情没有任何约束。调用者使用多个参数设置函数调用,激发它并(通常)等待响应或异常

有些人认为为每个方法创建HTTP端点就足以创建RESTful端点,但事实并非如此。然而,创建这样的HTTP端点可能对您仍然有意义,在这种情况下,您应该继续寻找一个提供这种功能的框架

我的答案以“不,没有”开头的原因是,为了创建REST接口,仅发布HTTP端点是不够的,您必须做更多的工作:

  • 查找要重用的媒体类型
  • 查找要重用的链接关系
  • 设计自己的媒体类型
  • 定义自己的链接关系

世界上还没有一个框架能够获取任意的函数签名列表并为您完成这四件事。框架允许您比SOAP更多地利用HTTP(例如OAuth、OpenID、缓存、幂等),但它们并不能让您完全休息

我不太喜欢soap web服务,但通过谷歌搜索发现,apache的Axis 2框架不仅提供了soap 1.1和soap 1.2,还提供了具有相同业务逻辑实现的REST/POX。您可以查看更多信息:


我还是一名网络服务新手,所以我可以要求一些澄清吗?您是说您可以通过使用HTTP accept头来区分调用方想要返回的内容,同时提供SOAP/XML、SOAP/JSON、REST/JSOM和REST/POX吗?如何实现这一点?什么工具和框架支持这一点?是的,你理解得对。这一切都只是将web服务响应正确序列化为客户机能够理解的格式的问题。(顺便说一句,没有SOAP/JSON.:-)我不知道是否有/什么javaweb服务框架以及哪些框架支持响应格式转换,但我认为任何现代web服务框架都应该支持它。如果你提供一些你正在使用的特定框架的细节,我相信人们将能够确切地告诉你如何使用它。我还没有使用一个框架,只是试图找出选择一个框架的重要标准。其他人向我推荐了CXF。它能支持这一点吗?我没有使用它,但根据CXF,它支持SOAP和REST/HTTP绑定以及XML、JSON和FastInforset消息格式。这是客户的要求,因为该系统将是更大的SOA战略的一部分。这是否特别适用于WCF?我之前没有提到它,因为我认为这并不重要,但是这个应用程序是作为一个Javaservlet实现的。如果您的平台是Java,那么应该将其添加到标记中。