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

时间:2015-01-17 03:50:42

标签: java web-services rest soap

我正在使用Java学习Web服务,并想知道它是否可行。

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

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

然后,我想知道(我仍然想知道)这个REST客户端是否可以作为SOAP Web服务的服务器工作,如图所示。

enter image description here

我通过在EJB中创建Web服务类来尝试它。我将与REST客户端几乎相同的代码写入EJB的Web服务类,以便Web服务类使用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

可能只是因为我已经创建了一个使用相同网址的REST客户端,但我还没有找到原因。

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

任何见解都将受到赞赏。

PS

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

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,出于学习(非实际)原因,您希望让REST Web服务调用SOAP Web服务(反之亦然)。对于一些较旧的库,由于库中的设计/代码问题,这是不可能的。但是,如果您使用的是当前版本的库,则不再适用。

使用您想要的API构建REST服务(spring库将很好地完成此操作),并将控制器方法映射到您要调用的SOAP Web服务(反之亦然)。您正在谈论使用Spring注释和一些包装代码以及Java EE漏洞的几个控制器类。

如果我向后理解问题,答案基本相同 - 只需交换SOAP和REST注释。

答案 1 :(得分:0)

是 - 它可以......

我不知道你正在使用什么REST jar - 请选择Apache CXF或Jersey 2罐子。

为所有REST服务提供单一入口点 - 使用Apache CXF,您可以获得Front Servlet体系结构。

因此,您的REST服务将部署为

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

此处,Services会将其指向一个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充当Front Servlet,它会将请求重定向到您的底层REST Web服务。

现在转到SOAP Web服务:

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

当SOAP将调用它时,将调用默认HTTP端口上的servlet,在我们的情况下是9080(9080 web sphere),但端口号是客户可以配置它