java - 使用 SOAP 复制 REST API

标签 java spring grails spring-ws

我有一个简单的 REST api,它以 JSON 格式发送数据,如下所示:

http://myapp/color (POST w/ data in JSON) - Creates a new color in DB
http://myapp/color/id (GET) - Fetches details for a color from DB
http://myapp/color (GET) - Fetches details for all colors in DB

我也想为这三个函数创建一个 SOAP API。所以我选择 Spring-WS。

我已经为创建创建了 SOAP API。使用以下 XSD

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:hr="http://www.myveryimportantcompany.com/tr/schemas"
           targetNamespace="http://www.myveryimportantcompany.com/tr/schemas"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">
<xs:element name="ColorRequest">
    <xs:complexType>
        <xs:all>
            <xs:element name="Color" type="hr:ColorType"/>
        </xs:all>
    </xs:complexType>
</xs:element>
<xs:complexType name="ColorType">
    <xs:sequence>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>
<xs:element name="ColorResponse">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="status" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>

我还为上述内容编写了功能测试,效果很好。

问题 - 我过去从未创建过 SOAP WS,因此如果问题很愚蠢,请忽略。

  • 对于其余两个函数,XSD 会是什么样子?
  • 每个功能都需要单独的 XSD 吗?
  • 我也可以使用 GUI 测试 SOAP 服务吗?我给 SOAP GUI 做了一个演示,但它需要 WSDL。我怎样才能创建它?

PS:我正在使用 grails 的 Spring-WS 插件。

最佳答案

我敢打赌这是一个主观问题。我将尝试尽可能详细地回答以使其有用。耐心听我说。 :)

第一件事:-

  • SpringWS插件使用契约优先的网络服务。您在此处创建的架构应该是底层 Web 服务的契约(Contract)。
  • 每个网络服务都应该有自己的契约(Contract),这意味着它自己的架构。
  • SpringWS 遵循创建 Endpoint 的约定与契约(Contract)名称相同schema .
  • 您可以在端点中使用继承,这将帮助您为所有合约创建单个 xsd 架构。在这种情况下,您必须在相应的子端点中继承父端点。

示例:-
为了大家的方便,让我们使用 User服务而不是 Color .

//Domain:-
class User{
    String name
    String email
    Integer age
}

我会为这个实体准备一个基本架构,类似于您之前为Color所做的事情。 :

<!-- User.xsd -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:hr="http://www.myveryimportantcompany.com/tr/schemas"
           targetNamespace="http://www.myveryimportantcompany.com/tr/schemas"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">
<xs:complexType name="UserType">
    <xs:sequence>
        <xs:element name="name" type="xs:string"/>
        <xs:element name="email" type="xs:string"/>
        <xs:element name="age" type="xs:integer"/>
    </xs:sequence>
</xs:complexType>

<xs:element name="User" type="hr:UserType"/>

</xs:schema>

现在查看每项服务的每份契约(Contract):-

<!-- GetUserService.xsd -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:hr="http://www.myveryimportantcompany.com/tr/schemas"
           targetNamespace="http://www.myveryimportantcompany.com/tr/schemas"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">
<xs:element name="GetUserRequest" type="hr:GetUserRequestType"/>
<xs:complexType name="GetUserRequestType">
    <xs:sequence>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:element name="GetUserResponse" type="hr:GetUserResponseType"/>    
<xs:complexType name="GetUserRequestType">
    <xs:sequence>
        <xs:element ref="hr:User"/>
    </xs:sequence>
</xs:complexType>
</xs:schema>

同样,您可以拥有UpdateUserService.xsd进行更新 [POST, PUT] 部分。

或者,您可以将所有 xsd 累积到名为 UserServices.xsd 的单个合约中。

警告
如果所有服务只有一个 xsd,则必须创建一个名为(完全相同)的父端点 UserServicesEndpoint.groovy (请参阅 springws 文档如何创建端点),那么您的服务端点将类似于

class GetUserServiceEndpoint extends UserServicesEndpoint{....}
class UpdateUserServiceEndpoint extends UserServicesEndpoint{....}

如果您将所有 xsd 分开,则不需要继承。

问题答案:

  1. 其余两个函数的 XSD 会是什么样子?
    现在你知道它应该是什么样子了。名称应类似于 UpdateColorService.xsd , GetColorService.xsd , GetAllColorsService.xsd

  2. 每个功能都需要单独的 XSD 吗?
    按照上面的操作。您可以将它们分开,也可以将它们放在一个父 xsd 中。在这种情况下,还必须有一个父端点。

  3. 我也可以使用 GUI 测试 SOAP 服务吗?我给 SOAP GUI 做了一个演示,但它需要 WSDL。我该如何创建它?
    是的你可以。我发现的最好的工具是SoapUI (免费版本对我来说就足够了)。您还可以使用Apache JMeter ,如果您对此感到满意。契约优先服务始终需要 WSDL 才能运行。作为 SpringWS 插件的一部分,您拥有出色的 DSL 支持,它可以在运行应用程序后为您创建 WSDL。再次按照文档进行操作。我可以在另一个问题中解释这一点,因为这个答案现在已经成为史诗。

忠告:

  • 最后,当整个世界都处于和平状态时,为什么还需要 SOAP 服务? :)

  • springws 插件几乎已经过时,并且多年来一直不受支持。我已经根据自己的需要定制了该插件,但尚未将其提交给 Grails PLugins。没有感觉吗?但我想我现在必须这么做,因为@Anthony 正在使用它。 :)

  • 该插件在项目的 lib 中有 jars可能与您的依赖项发生冲突的目录。

  • 插件使用旧版本 spring-ws-core spring-core:3.1.2 肯定会崩溃附带 Grails 2.2.x

  • 使用较新版本的 JDK(7 或更高版本)可能会出现编译错误。

关于java - 使用 SOAP 复制 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17091795/

相关文章:

Java 序列化异常消息

Spring MVC Tomcat启动失败

java - Grails 应用第二天拒绝连接

java - invokeAll 的参数(集合)是否取决于队列大小?

java - 考虑在您的配置中定义一个类型的 bean

java - 无法从 log4j2 客户端 GUI 连接到我的应用程序

java - 如何使用 .htaccess 来加速 Spring 网站为不同类型的文件自定义浏览器缓存

grails - 在 Grails 中创建一个新的资源包?

java - 如何在Grails的闭包内部动态比较 HashMap 键?

java - 将泛型与 Firebase snapshot.getValue() 结合使用的最佳实践