0

我正在为具有多个属性的对象实现 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 和/或项目名称)以识别项目。这是消费者只需要知道的,并且在界面描述中没有明确说明。

  2. UpdateProject 请求应包含关键列(id 和/或项目名称)和更新的列。再一次,仅通过检查接口无法知道它,因为所有都是 minOccurs="0"。

  3. CreateProject 请求应包含项目最初需要的一些字段。id 由 WS 创建,必须发送回消费者。响应将再次为 tProject 但其中只有 id。

当我在这里写它时,感觉它违反了关于 wsdl 设计的一切。

4

1 回答 1

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>
  • 获取项目

    • 请求 = tProjectKeys
    • 响应 = tProject
  • 更新项目

    • 请求 = tUpdateProject
    • response = nothing(所有消息都应该有具有状态的标头)
  • 创建项目

    • 请求 = tCreateProject
    • response = 创建项目的id

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

于 2012-11-01T21:15:07.130 回答