0

我有一个简单的 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 插件。

4

1 回答 1

1

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

首先第一件事:-

  • SpringWS插件使用契约优先的 web 服务。您在此处创建的模式应该是底层 Web 服务的合同。
  • 每个 web 服务都应该有自己的契约,这意味着它自己的模式。
  • SpringWS 遵循创建一个Endpoint名称与合同名称相同的约定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>

现在来到每个服务的每个合同:-

<!-- 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 插件。没感觉?但我想我现在必须这样做,因为@Anthony 正在使用它。:)

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

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

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

于 2013-06-13T17:57:12.627 回答