应该以一种可以直接看到消息内容的方式设计wsdl + xsd吗?

时间:2012-11-01 19:52:42

标签: xml web-services wsdl xsd

我正在为具有多个属性的对象实现CRUD Web服务。我应该定义像

这样的单一类型
<xs:complexType name="tProject">
 <xs:sequence>
  <xs:element name="id" type="xs:int" minOccurs="0" />
  <xs:element name="projectname" type="xs:string" minOccurs="0" />
  <xs:element name="projectnum" type="xs:string" minOccurs="0" />
  <xs:element name="description" type="xs:string" minOccurs="0" />

  <!-- here another 30-some attributes -->
 </xs:sequence>
</xs:complexType>

并将其用于所有操作:

  1. GetProject请求和响应都包含tProject。作为响应,所有字段都在那里,但请求应包含用于标识项目的键列(id和/或projectname)。这是消费者必须知道的东西,并且在界面描述中没有明确说明。

  2. UpdateProject请求应包含键列(id和/或projectname)以及更新的列。再次通过检查接口导致所有都是minOccurs =“0”无法知道。

  3. CreateProject请求应包含一些最初要用于项目的字段。 id由WS创建,必须发送回消费者。响应将是tProject,但只有id。
  4. 当我在这里写它时,它感觉它违反了wsdl设计的一切。

1 个答案:

答案 0 :(得分:0)

我试着回答我自己的问题。我希望我能得到更好的答案,但是对于我的下一个方法有什么不对,我会很高兴:

<!-- only updatable fielsds here -->
<xs:complexType name="tProjectBase">
 <xs:sequence>
   <xs:element name="projectnum" type="xs:string" minOccurs="0" />
   <xs:element name="description" type="xs:string" minOccurs="0" />
   <xs:element name="accepteddate" type="xs:dateTime" minOccurs="0" />
   <xs:element name="activeyears" type="xs:int" minOccurs="0" />
 </xs:sequence>
</xs:complexType>

<!-- extending updateble with keys and not updateble -->
<xs:complexType name="tProject">
 <xs:complexContent>
  <xs:extension base="tProjectBase">
    <xs:sequence>
      <xs:element name="id" type="xs:int" />
      <xs:element name="projectname" type="member"/>
      <xs:element name="projectcreator" type="xs:string" /> <!--not updatable-->
    </xs:sequence>
  </xs:extension>
 </xs:complexContent>
</xs:complexType>

<!-- only keys here -->
<xs:complexType name="tProjectKeys">
  <xs:choice>
   <xs:element name="id" type="xs:int"/>
   <xs:element name="projectname" type="xs:string"/>
  </xs:choice>
</xs:complexType>


<xs:element name="tUpdateProject">
 <xs:complexType>
  <xs:sequence>
    <xs:element name="keys" type="tProjectKeys" />
    <xs:element name="project" type="tProjectBase" />
  </xs:sequence>
 </xs:complexType>
</xs:element>


<xs:element name="tCreateProject">
 <xs:complexType>
  <xs:sequence>
    <xs:element name="projectcreator" type="xs:string />
    <xs:element name="project" type="tProjectBase" />
  </xs:sequence>
 </xs:complexType>
</xs:element>
  • GetProject

    • request = tProjectKeys
    • reponse = tProject
  • UpdateProject

    • request = tUpdateProject
    • response = nothing(所有消息都应该包含具有状态的标头)
  • 的createProject

    • request = tCreateProject
    • 响应=已创建项目的ID

这种方法也存在问题。例如,现在键是“硬编码的”。如果某些客户将projectnum作为唯一的并且希望将其用作从外部系统更新项目的密钥,该怎么办?也许这是他们的外部系统使用的信息。所以原问题的方案更灵活。但是要走哪条路?