我们使用Spring构建一个应用程序并使用Tomcat进行部署。我们有一个工作的REST接口,但是我们的一个客户端只有一个SOAP客户端。
我的理解是SOAP Web服务和REST Web服务不能在同一个端口或应用程序上共存。
我可以选择尽可能少地接受SOAP请求。我应该通过rest接口接受soap数据包并解析XML吗?或者我可以设置SOAP接口与我的REST接口通信并回复?
我正在使用Gradle作为我的构建工具。将解决方案作为单个WAR文件的一部分会很好
根据我的经验,如果您对JAXB的XML命名空间非常小心,可以在同一个应用程序中混合使用SOAP和REST。但是,我不推荐它,因为更新一个意味着冒着对方的稳定性。这是我推荐的......
我应该通过rest接口接受soap数据包并解析XML吗?
SOAP是一种协议而不仅仅是一种格式,因此这可能不适用于大多数(任何?)框架。
或者我可以设置SOAP接口与我的REST接口通信并回复?
您可能会牺牲性能和/或可维护性。
我们有一个具有类似要求的项目。我们仍然需要支持SOAP,我们将继续使用ReST。
没有理由说这两者会发生冲突。由于您使用的是spring,因此您甚至可以将相同的域对象作为响应,将其作为您的首选项编组为XML和JSON。
你要做的是为两者创建不同的URI。例如someService/**
用于SOAP和some-rest
用于ReST实现。您可以拥有一个服务层来处理共享逻辑(主要是端点上需要的代码,其余控制器是从服务层获取所需数据并将其发送到编组)
只需在web.xml
文件中添加一些条目即可指示其余路径和端点路径......
听起来你的网络服务主要是REST(它是2013年),但你必须支持有限的情况下的肥皂。我主要考虑休息时设计您的Web服务,但也许使用单独的机制向服务器指示客户端需要soap支持。如果可能,请让soap客户端发送http请求标头或使用可能以.soap结尾的修改后的URL。在任何情况下,没有理由不能在同一个应用程序上支持这两种协议。
你可以通过在类实现上注释rest和soap,以及创建用于保存汤的方法注释的接口来实现。并在类实现中将rest注释放在方法上并配置web.xml
文件以添加servlet
以用于您使用的其余实现。 _为您使用的Rest实现添加配置[ApplicationConfiguration is class only extend Application]
<servlet>
<servlet-name>com.fawryis.ebpp.core.rs.config.ApplicationConfiguration</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>com.fawryis.ebpp.core.rs.config.ApplicationConfiguration</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
@javax.jws.WebService(endpointInterface = "com.test.ebpp.autopayment.tess.ejb.GService", targetNamespace = "http://ejb.test.autopayment.ebpp.tess.com/", serviceName = "testPaymentService", portName = "testPaymentPort")
@Path(value = "/testPaymentService")
public class testPaymentPortBindingImpl implements
testPaymentService {
@Override
@POST
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Typeobj process(Typeobj request) {
//type your code
}