RESTful 服务客户端可以作为 SOAP 服务的服务器吗?

Can a RESTful service client be a SOAP service's server?

我正在研究使用 Java 的 Web 服务,想知道它是否可行。

我使用 Java 客户端库制作了一个 RESTful 服务客户端,它遵循 REST 的原则。

(更具体地说,我在 Github 上找到了这个库并正在使用它。这个 Java 库与 CKAN 交互,这是一种 web-based 开源数据系统)

然后,我想知道(仍然想知道)这个 REST 客户端是否可以像这张图片描述的那样作为 SOAP Web 服务的服务器工作。

我通过在 EJB 中创建 Web 服务 class 进行了尝试。我将几乎与 REST 客户端相同的代码写入 EJB 的 Web 服务 class,以便 Web 服务 class 将使用 GET、POST 和 DELETE 方法。

但是,当我尝试部署此 EJB(一种 SOAP Web 服务)时,Glassfish 服务器指示...

Two web services are being deployed with the same endpoint URL ckan/ckan; The service that gets loaded last will always be the one that is active for this URL.

Exception while invoking class org.glassfish.ejb.startup.EjbDeployer load method

java.lang.RuntimeException: EJB Container initialization error

可能只是因为我已经制作了一个使用相同URL的REST客户端,但我还没有找到真正的原因。

您是否认为,在 SOAP 网络服务中,服务器端可以使用标准化的服务器方法(即 GET/POST/DELETE 等)以便与外部数据存储库(即,在我的情况是 CKAN ... web-based 数据管理系统)?

任何见解将不胜感激。

PS

使用REST客户端作为SOAP的服务器的目的是测试REST和SOAP的安全问题,并进行比较。 我认为以这种方式使用 REST 客户端是不切实际的。

如果我对您的问题的理解正确,出于学习(不实用)的原因,您希望让 REST Web 服务调用 SOAP Web 服务(反之亦然)。对于一些较旧的库,这是不可能的,因为库中存在 design/code 个问题。但是,如果您使用的是当前版本的库,则不再如此。

使用您想要的 API 构建 REST 服务(spring 库可以很好地做到这一点),并将控制器方法映射到您要调用的 SOAP 网络服务(反之亦然)。您正在谈论带有 Spring 注释和一些包装器代码以及 Java EE 的一些控制器 类。

如果我反过来理解这个问题,答案基本上是一样的——只是交换 SOAP 和 REST 注释。

是的 - 它可以..

我不知道您使用的是什么 REST jar - 请使用 Apache CXF 或 Jersey 2 jar。

为所有 REST 服务提供单一入口点 - 使用 Apache CXF,您可以获得前端 Servlet 架构。

因此您的 REST 服务将部署为

http://localhost:8080/**myRESTSERVICES**

这里的服务会将其指向一个 Servlet,该 Servlet 会将调用路由到基础 REST 服务。

这是 Web.xml 示例:

<servlet>
        <servlet-name>CXFServlet</servlet-name>
        <display-name>CXF Servlet</display-name>
        <servlet-class>
            org.apache.cxf.transport.servlet.CXFServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
 <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/myRESTSERVICES</url-pattern>
    </servlet-mapping

这里 CXF Servlet 充当前端 Servlet,它将请求重定向到您的底层 REST Web 服务。

现在介绍 SOAP Web 服务:

SOAP 服务将 运行 在不同的端口上,如 REST 所说:9040 - 或者任何你想要的。

当 SOAP 调用时,它会在默认 HTTP 端口上调用 servlet,在我们的例子中是 8080(9080 web sphere),但端口号是自定义的 - 你可以配置它