我正在为具有多个属性的对象实现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>
并将其用于所有操作:
GetProject请求和响应都包含tProject。作为响应,所有字段都在那里,但请求应包含用于标识项目的键列(id和/或projectname)。这是消费者必须知道的东西,并且在界面描述中没有明确说明。
UpdateProject请求应包含键列(id和/或projectname)以及更新的列。再次通过检查接口导致所有都是minOccurs =“0”无法知道。
当我在这里写它时,它感觉它违反了wsdl设计的一切。
答案 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
UpdateProject
的createProject
这种方法也存在问题。例如,现在键是“硬编码的”。如果某些客户将projectnum作为唯一的并且希望将其用作从外部系统更新项目的密钥,该怎么办?也许这是他们的外部系统使用的信息。所以原问题的方案更灵活。但是要走哪条路?