单个应用程序的 REST 和 SOAP Web 服务

Posted

技术标签:

【中文标题】单个应用程序的 REST 和 SOAP Web 服务【英文标题】:Both REST and SOAP Web Services for a single application 【发布时间】:2013-12-23 06:09:04 【问题描述】:

我们已经使用 Spring 构建了一个应用程序,并使用 Tomcat 进行了部署。我们有一个可用的 REST 接口,但是我们的一个客户端只有一个 SOAP 客户端。

我的理解是 SOAP Web 服务和 REST Web 服务不能在同一个端口或应用程序上共存。

我有哪些选择来接受 SOAP 请求并尽可能少地进行开发。我应该通过其余接口接受一个肥皂包并解析 XML 吗?或者我可以设置一个 SOAP 接口与我的 REST 接口通信并做出响应吗?

我使用 Gradle 作为我的构建工具。将解决方案作为单个 WAR 文件的一部分会很好

【问题讨论】:

为该客户开发 REST 客户端会更简单吗? 其实这是一个好点,但我认为他们的应用程序处于“濒临死亡 - 尽可能少触摸”模式 【参考方案1】:

根据我的经验,如果您非常注意 JAXB 的 XML 命名空间,您可以在同一个应用程序中混合使用 SOAP 和 REST。但是,我不推荐它,因为更新一个意味着冒另一个的稳定性。这是我推荐的...

    Setup a multi-project build in gradle 创建三个项目,一个用于业务逻辑,一个用于 REST 接口,一个用于 SOAP 接口 修改 REST/SOAP 接口以使用通用业务逻辑项目 部署为两个独立的 WAR

我应该通过rest接口接受一个soap包并解析XML吗?

SOAP 是一种协议,而不仅仅是一种格式,因此这可能不适用于大多数(任何?)框架。

或者我可以设置一个 SOAP 接口与我的 REST 接口通信并做出响应吗?

您可能会以牺牲性能和/或可维护性为代价。

【讨论】:

谢谢。我会试一试。那么一个 WAR 有 REST 加业务逻辑,另一个有 SOAP 接口? 恕我直言,两个 WAR 文件都将使用提供业务逻辑的第三个 jar。 (对不起,不能不回答这个问题:-))【参考方案2】:

我们有一个项目有类似的要求。我们仍然必须支持 SOAP,并且我们将继续使用 ReST。

没有理由两者会发生冲突。由于您使用的是 spring,因此您甚至可以将相同的域对象作为响应编组为 XML 和 JSON 作为您的偏好。

您要做的是为两者创建不同的 URI。例如,someService/** 用于 SOAP,some-rest 用于 ReST 实现。您可以有一个服务层来处理共享逻辑(主要是端点所需的代码,其余控制器是从服务层获取所需的数据并将其发送到编组)

只需在您的 web.xml 文件中添加一些条目以指示其余路径和端点路径...

【讨论】:

我同意这种方法。我发现支持 JAXB 的基于 REST 的 Java Jersey 项目可以帮助解决这个问题:ibm.com/developerworks/library/wa-aj-tomcat【参考方案3】:

听起来您的网络服务主要是 REST(它是 2013 年),但您必须在有限的情况下支持 soap。我会在设计您的 Web 服务时主要考虑休息,但可能会使用单独的机制向服务器指示客户端需要肥皂支持。如果可能,让soap 客户端发送一个http 请求标头或使用可能以.soap 结尾的修改后的URL。无论如何,您没有理由不能在同一个应用程序上同时支持这两种协议。

【讨论】:

【参考方案4】:

您可以按照以下步骤进行操作:

 -Add annotation of both Rest and Soap on class implementation.
 -Creating interface to hold the method annotation for Soap.
 -Put Rest annotation on method in class implementation.
 -Configure "web.xml" file to add "servlet" for Rest implementation you use.  
 -Don't forget to create class extend Application like [ApplicationConfiguration.class].

1-类实现

@javax.jws.WebService(endpointInterface = "com.test.ebpp.autopayment.tess.ejb.GService", targetNamespace = "http://ejb.test.autopayment.ebpp.tess.com/", serviceName = "ApplicationBusinessFacadeService", portName = "ApplicationBusinessFacadePort")
@Path(value = "/ApplicationBusinessFacadeService")
public class ApplicationBusinessFacadePortBindingImpl implements
    ApplicationBusinessFacade 
    @Override
    @POST
    @Consumes( MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML )
    @Produces( MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML )
    public ProcessResponse process(Process request) 
        //type your code 
    

2- 服务接口

@WebService(name = "ApplicationBusinessFacade", targetNamespace =   "http://ejb.gateway.ebpp.com/")
@XmlSeeAlso(
com.ebpp.gateway.ejb.ObjectFactory.class,
com.ebpp.ifxmessages.ObjectFactory.class
)
public interface ApplicationBusinessFacade 

@WebMethod
@WebResult(targetNamespace = "")
@RequestWrapper(localName = "process", targetNamespace = "http://ejb.gateway.ebpp.com/", className = "com.ebpp.gateway.ejb.Process")
@ResponseWrapper(localName = "processResponse", targetNamespace = "http://ejb.gateway.ebpp.com/", className = "com.ebpp.gateway.ejb.ProcessResponse")
public ProcessResponse process(
    @WebParam(name = "arg0", targetNamespace = "")
    Process arg0);
 

3- web.xml

 <servlet>        
        <servlet-name>com.ebpp.core.rs.config.ApplicationConfiguration</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>com.ebpp.core.rs.config.ApplicationConfiguration</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
 </servlet>

【讨论】:

此代码为我运行,有关更多信息,您可以通过 ahmed.albhy2001@gmail.com 发送给我,对于 web.xml,请尝试将 url-pattern 更改为 /rest/*

以上是关于单个应用程序的 REST 和 SOAP Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Web API

SOAP to Rest 网关的最佳解决方案

SOAP和REST API测试技巧

Web 服务的安全性(REST 和 SOAP)[关闭]

比较和对比 REST 和 SOAP Web 服务? [复制]

SOAP Web 服务介绍