PHPの学び方:WSDLの詳しい解説(1)
WSDL文書はWebサービス記述言語を使ってサービスを定義します。
文書には、論理的な (抽象的な) 部分と具体的な部分が含まれます。
抽象部分は、実装とは独立してデータ型とメッセージを定義するために使用され、特定部分は、エンドポイントが外部の世界と対話できるサービスを実装する方法を定義します。
通常、コードを記述する前に WSDL ドキュメントと XML スキーマを定義することが推奨されますが、これには WSDL に精通している必要があります。
論理部分:
type、message、および portType 要素が含まれます。 types 要素では、xml スキーマを使用してメッセージを構成するデータの構造を定義します。サービスで使用されるメッセージの形式を定義するために、特定の数のメッセージ要素が使用されます。 portType 要素には、操作によって送信されるメッセージを定義するために使用される 1 つ以上の操作要素が含まれます。
特定の部分:
バインディング要素とサービス要素が含まれます。 binding 要素は、message 要素によって記述されたデータユニットが特定のデータ形式にどのようにマッピングされるかを記述します。 Service 要素には、エンドポイントの定義に使用される 1 つ以上の port 要素が含まれます。
一般に、WSDL ドキュメントは次の要素で構成されます:
- 定義 -- WSDL ドキュメントのルート要素。この要素の属性は、wsdl ドキュメントの名前、ドキュメントのターゲット名前空間、および WSDL ドキュメントに適用される名前空間の短縮定義を指定します。
- types – サービスで使用されるメッセージの構成要素を形成するデータ単位の XML スタイル定義。
- portType---サービス論理インターフェイスを記述する操作要素のコレクション。
- オペレーション -- サービスに含まれるオペレーションの説明。オペレーションが呼び出されるとき、そのオペレーションは 2 つのエンドポイント間のメッセージの受け渡しとして定義されます。
- binding---エンドポイントの実際のデータ形式の説明。バインディング要素は、抽象メッセージを特定のデータ形式にマップする方法を定義します。この要素はパラメータの順序や戻り値などの情報を指定します。
- サービス---関連するポート要素のコレクション。ライブラリに保存され、ユーザー組織のエンドポイントによって定義されます。
- port - バインディングと物理アドレスを通じて定義されたエンドポイントは、すべての抽象定義をまとめます。
WSDL を設計する手順:
1. サービスで使用されるデータ型を定義します
2. サービスで使用されるメッセージを定義します
3. サービス インターフェイスを定義します
4. メッセージとインターフェイス間のバインディング、およびオンライン データの特定の表示方法を定義します
5. 各サービスの送信詳細を定義します。
以下は、各ステップに基づいた説明です。
1. 論理データ単位を定義する
サービスを定義するときに、最初に考慮する必要があるのは、それを公開する方法です。外部へ パラメータで使用されるデータはどのように提示されますか。固定データ構造エンコーディングを選択するプログラムとは異なり、サービスはデータを論理ユニットの形式で定義する必要があります。これには次の 2 つの手順が含まれます。
1.1 データをマッピング可能な論理ユニットに分割する データ型であり、参照されるサービスの物理的な実装によって。
サービス インターフェイスを定義し、そのインターフェイスが実装されている場合は、操作を実装するデータ型を、メッセージにアセンブリするための XML 要素に変換する必要があります。ゼロから始める場合は、実装の観点から意味をなすように、メッセージの構築ブロックを定義する必要があります。
注 1: サービス データ ユニットに使用できる型システムを定義します。WSDL 仕様に従って、任意の型システムを使用できます。ただし、W3C 仕様で定義されている XML スキーマは、推奨される標準型システムです。 したがって、、XML スキーマ は、Apache CXF の 🎜> 型システムに固有の です。 。
注 2: xml スキーマ: xml スキーマは、xml 文書の構築方法と文書がどのような要素で構成されるかを定義するために使用されます。これらの要素は、xsd:int などの XML スキーマ タイプを使用することも、XML 要素の組み合わせを使用して構築されるユーザー定義タイプを使用することも、厳密な既存のタイプを使用して構築することもできます。 型定義を 要素定義 と組み合わせることで、 は 複合 XML ドキュメント には 個の複雑なデータを含めることができます。サービスで使用されるデータ ユニットを定義する場合、メッセージ コンポーネントの構造を指定するタイプとして定義できます。また、メッセージ ユニットをメッセージ構造を構成する要素として定義することもできます。 注 3: データ ユニットの生成に関する考慮事項: サービスで使用するデータ型を直接マップする論理データ ユニットを単純に生成することを検討できます。この方法で作業する場合、RPC タイプのアプリケーションを構築するためのビルド モデルに厳密に従う必要があります。これは、サービス指向アーキテクチャ アプリケーションを構築する場合には必須の戦略ではありません。 Web サービス組織は、データ単位を定義するためのマニュアルを多数提供しています。また、W3C は、xml スキーマを使用してデータ型を表示する方法を説明するマニュアルも main の下に提供しています。
1.2 ドキュメントにデータユニットを追加します
WSDL ドキュメントの生成方法に応じて、新しいデータ定義の生成には多くの知識が必要ですが、CXF GUI ツールはデータ型を説明するためのある程度のヘルプを提供します。他の XML エディターは、さまざまなレベルのヘルプを提供します。 どのエディタを選択する場合でも、ドキュメントに関する知識を持っていることが重要です。
WSDL で使用されるデータを定義するには、次の手順が必要です:
a. インターフェース
で使用されるすべてのデータ単位を決定します。 b. タイプ要素を生成します。文書内にあります。
c. type 要素
の子要素としてスキーマ要素を作成します。 d. 複合型は要素のコレクションであり、complexType 要素を使用してデータ型
e. 各配列について、そのデータ型も complexType 要素
を使用して定義されます。 f. 各複合型は単純型から派生でき、データ型はsimpleType 要素。
g. 列挙型ごとに、simpleType 要素を使用してデータ型を定義します。
h. 各要素について、element 要素を使用して定義します。
1.3 xml スキーマの単純型:
メッセージ コンポーネントが単純型の場合、その型を定義する必要はありません。インターフェイスで使用される複合型も、単純型を通じて定義されます。
注 1: 入力単純型: XML 単純型は、element 要素内の主要な配置要素です。単純型は、制限要素および拡張要素の基本属性でも使用されます。単純型には常に xsd という接頭辞が付きます。たとえば、int 型を指定するには、type 属性に xsd:int を入力します。
9d1b1b984b6e964161ff00638e061d07
CXF は、次の XML スキーマ単純型をサポートします: xsd:string、xsd:normalizedString、xsd:int 、xsd:base64Binary など。
1.4 複雑なデータ型の定義:
XML スキーマは、責任のあるデータ構造を構築するための柔軟で強力なメカニズムを提供します。一連の要素と属性を作成することで、データ構造を作成できます。既存の型を拡張して、より複雑な型を作成できることがわかります。
さらに、複雑なデータ構造を構築するために、列挙型などの特定の型を記述することができます。データ型のデータは特定の範囲の値を持つか、元の型を拡張または制限することによって、データ型の値が特定のパターンに従う必要があります。
1.5 データ構造の定義:
XML スキーマでは、データ単位はデータ フィールドのコレクションであり、これらのデータ フィールドは責任のある型要素によって定義されます。複合型を指定するには、次の 3 つの情報が必要です。
a. 複合要素の名前を指定する必要があります。
b. 複合型の最初の子要素は、構造体がライン上に配置されたときのドメインの動作を記述するために使用されます。
c. 各構造体のフィールドは要素要素を使用して定義されます。
次の Leizi は 2 つのサブ要素を持つ複合型です:
構造は次のとおりです:
<div style="text-align:left">struct personalInfo</p>{ string name;<div style="text-align:left"></p> int age;<div style="text-align:left"></p>};
対応する WSDL ドキュメント:
<div style="text-align:left"><complexType name="personalInfo"></p> <sequence><div style="text-align:left">name="name" type="xsd:string" /> <element</p> <element name="age" type="xsd:int" /> </sequence><div style="text-align:left"></p></complexType>
注 1: 複合型の種類:
の 3 つのタイプがあります。 xml スキーマ このメソッドは、XML ドキュメントをオンラインでレンダリングして表示するときに、XML ドキュメント内のフィールドがどのように編成されるかを記述します。最初の子要素は、どの複合型が参照されるかを決定します。以下に、複合型の動作を定義する 3 つの方法を示します。
- シーケンス: すべての複合型フィールドが表示される必要があり、型定義の順序と一致する明確な順序が必要です。 。 同じ。
- all: すべての複合型フィールドが必須ですが、順序は関係ありません。
- choice: メッセージ内に表示できる要素は 1 つだけです。
注 2: 構造を定義する部分:
構造で構成されるデータ フィールドを定義します。各複合型要素には、少なくとも 1 つの element 要素が含まれている必要があります。各要素は、定義されたデータ構造内のフィールドに対応します。
データ構造内のフィールドを完全に記述するために、要素には 2 つの属性が必要です:
name 属性: データ フィールドの名前を指定し、一意の
タイプ属性: このフィールドに保存されるデータのタイプを指定します。単純型または複合型のいずれかにすることができます。
さらに、minOccurs と maxOccurs という 2 つの重要な属性があります。この属性は、構造内でこのフィールドが出現する回数の上限と下限を設定するために使用されます。デフォルトでは、フィールド値ごとに 1 回発生します。これらのプロパティを使用すると、構造内のフィールドの出現数を変更できます。以下の例では、previousJobs は少なくとも 1 回、最大で 7 回発生します。
<div style="text-align:left"><complexType name="personalInfo></p> <all><div style="text-align:left">ment name="name" type="xsd:string"/> <el</p> <eleement name="age" type="xsd:int"/><div style="text-align:left">pe="xsd:string: minOccurs="3" maxOccu</p> <element name="previousJobs" tyrs="7"/> </all><div style="text-align:left"></p></complexType>
注 3: 属性の定義: XML 文書では、属性は要素内に含まれます。たとえば、name は complexType 要素の属性であり、通常は 72b96a4fd26a14b531b12ddf122686e3、6e9388779e5fc4a565f66fe84a63ec67 などの要素の後に続きます。例:
<div style="text-align:left"><complexType name="personalInfo></p> <all><div style="text-align:left">ment name="name" type="xsd:string"/> <el</p> <eleement name="previousJobs" type="xsd:string"<div style="text-align:left"></all> <attribute name="age" type="xsd:i</p> minOccurs="3" maxOccurs="7"/> nt" use="optional" /><div style="text-align:left"></p></complexType>
1.6定义数组
CXF支持两种方式来定义数组,第一种是定义一个复杂类型,采用简单元素,他的最大发生属性是个大于1的值,第二种方式是使用SOAP数组,SOAP数组提供增加的功能,比如ability来简化定义多为数组并且发送分离后的数组。
复合类型数组:复合类型数组是特殊的sequence复合类型。你可以简单定义一个复合类型通过简单元素,并且制定该元素的最大发生maxOccurs属性。例如,定义一个数组,拥有二个浮点数字,你可以使用复合类型如下:
<div style="text-align:left"><complexType name="personalInfo></p><div style="text-align:left"> <element name="averages" type="xsd:float" maxOccurs="20"/></p><div style="text-align:left"></complexType></p>
你也可以定义一个最小发生属性。
SOAP数组:SOAP数组定义通过SOAP-ENC:Array,该类型基于wsdl:arrayType元素。
<div style="text-align:left"><complexType name="<span class="replaceable" style="padding:0px; margin:0px"><code style="padding:0px; margin:0px"><span style="font-family:NSimsun; padding:0px; margin:0px">TypeName</span></code></span>"></p><div style="text-align:left"> <complexContent></p><div style="text-align:left"> <restriction base="SOAP-ENC:Array"></p><div style="text-align:left"> <attribute ref="SOAP-ENC:arrayType" </p><div style="text-align:left"> wsdl:arrayType="<span class="replaceable" style="padding:0px; margin:0px"><code style="padding:0px; margin:0px"><span style="font-family:NSimsun; padding:0px; margin:0px">ElementType<ArrayBounds></span></code></span>"/></p><div style="text-align:left"> </restriction></p><div style="text-align:left"> </complexContent></p><div style="text-align:left"></complexType></p>
上述语法中,typename指定新定义的数组名,ElementType指定数组中元素的数据类型。ArrayBounds指定数组的维度及元素数量,单位数组通过[],多维通过[][]。
<div style="text-align:left"><complexType name="SOAPStrings"></p> <complexContent><div style="text-align:left">se="SOAP-ENC:Array"> <attribute r</p> <restriction baef="SOAP-ENC:arrayType"<div style="text-align:left">ayType="xsd:string[]"/> </restriction> </c</p> wsdl:arromplexContent><div style="text-align:left"></p></complexType>
1.7通过extension定义类型
类似主要的编码语言,xml schema允许你创建数据类型,这些数据类型集成已有的数据类型,这种机制被称之为:extension。例如你可以创建一个新类型名叫alienInfo,它集成了PersonalInfo结构,通过郑家了新的元素planet。
extension的类型定义包括四个部分:
a.通过name属性来定义类型名
b.通过complexContent元素来指定新类型将拥有多余一个的元素。
c.被继承的那个类,被称之为base类型,通过base属性来指定。
d.新类型和属性被定义在extension元素中。例子如下:
<div style="text-align:left"><complexType name="alienInfo"></p> <complexContent><div style="text-align:left">="personalInfo"> <sequence> </p> <extension base <element name="planet" type="xsd:string"/><div style="text-align:left">nt></complexType</p> </sequence> </extension> </complexCont<div style="text-align:left">e></p>
1.8通过restriction来定义类型
简单例子
<div style="text-align:left"><simpleType name="SSN"></p><div style="text-align:left"> <restriction base="xsd:string"></p><div style="text-align:left"> <pattern value="\d{3}-\d{2}-\d{4}"/></p> </restriction><div style="text-align:left"></p></simpleType>
1.9定义枚举类型:
<div style="text-align:left"><simpleType name="widgetSize"></p><div style="text-align:left"> <restriction base="xsd:string"></p> <enumeration value="big"/><div style="text-align:left">> <enumeration value="mungo"</p> <enumeration value="large"//> </restriction><div style="text-align:left"></p></simpleType>
2定义元素:
在xml schema中的元素体现为一个元素的实例。大多数最基本的元素有简单元素组成。像element元素,他是由一定数量的复杂类型定义的。它有三个属性:
- 名称:一个需要的属性来指明元素的名字
- type:指明元素的类型,这个类型可以是任何xml schema的原类型或者任何已经命名的复合类型。这个属性属性可以被省略,如果类型已经内置定义。
- nillable:指定是否元素可以从一个文档中忽略,如果是ture,则元素可以被任何根据该SCHEMA生成数据文件中忽略。
一个元素可以有一个内置类型定义,内置类型被指明,通过复合类型元素或者简单类型元素。一旦你说明了是否数据类型是复合或者简单,你可以定义任何你需要的数据类型。内置类型定义建议不被使用,因为他不支持重用。