我有一个简单的 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 分开,则不需要继承。
问题答案:
其余两个函数的 XSD 会是什么样子?
现在你知道它应该是什么样子了。名称应类似于UpdateColorService.xsd
,GetColorService.xsd
,GetAllColorsService.xsd
每个功能都需要单独的 XSD 吗?
按照上面的操作。您可以将它们分开,也可以将它们放在一个父 xsd 中。在这种情况下,还必须有一个父端点。我也可以使用 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/