0

複数の属性を持つオブジェクトにCRUDWebサービスを実装しています。次のような単一のタイプを定義する必要があります

<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のみが含まれます。

すでにここに書いたとき、それは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>
  • GetProject

    • リクエスト=tProjectKeys
    • 応答=tProject
  • UpdateProject

    • リクエスト=tUpdateProject
    • response = none(すべてのメッセージにはステータスのあるヘッダーがあるはずです)
  • CreateProject

    • request = tCreateProject
    • response=作成されたプロジェクトのID

このアプローチにも問題があります。たとえば、現在、キーは「ハードコーディング」されています。一部の顧客がprojectnumを一意であり、それを外部システムからプロジェクトを更新するためのキーとして使用したい場合はどうなりますか。多分それは彼らの外部システムが使用する情報です。したがって、元の質問のスキームはより柔軟です。しかし、どちらに行くのですか?

于 2012-11-01T21:15:07.130 に答える