最新のWeb開発のチュートリアル
 

XML Soap


  • SOAPは、簡易オブジェクトアクセスのP rotocolの略
  • SOAPはアプリケーション通信プロトコルであります
  • SOAPは、メッセージを送受信するためのフォーマットであります
  • SOAPは、プラットフォームに依存し
  • SOAPはXMLに基づいています
  • SOAPはW3C勧告です

なぜSOAP?

Webアプリケーションは、インターネットを介して通信できるようにすることが重要です。

HTTPは、すべてのインターネットブラウザとサーバでサポートされているため、アプリケーション間で通信するための最良の方法は、HTTPを介してです。 SOAPは、これを達成するために作成されました。

SOAPは異なる技術およびプログラミング言語で、異なるオペレーティングシステム上で実行中のアプリケーション間で通信する方法を提供します。


SOAPビルディング・ブロック

SOAPメッセージは、次の要素を含有する通常のXMLドキュメントです:

  • SOAPメッセージとしてXML文書を識別するEnvelope要素
  • ヘッダ情報を含むヘッダ要素
  • コールとレスポンスの情報が含まれていBody要素
  • エラーやステータス情報を含むFault要素

上記のすべての要素がSOAPエンベロープのデフォルトの名前空間で宣言されています。

http://www.w3.org/2003/05/soap-envelope/

そして、SOAPエンコーディングとデータ型のデフォルトの名前空間は、次のとおりです。

http://www.w3.org/2003/05/soap-encoding


構文規則

ここではいくつかの重要な構文規則は次のとおりです。

  • SOAPメッセージは、XMLを使用してエンコードされなければなりません
  • SOAPメッセージは、SOAPエンベロープの名前空間を使用しなければなりません
  • SOAPメッセージは、SOAPエンコーディングの名前空間を使用しなければなりません
  • SOAPメッセージは、DTDの参照を含めることはできません
  • SOAPメッセージは、XML処理命令を含めることはできません

スケルトンSOAPメッセージ

<?xml version="1.0"?>

<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">

<soap:Header>
...
</soap:Header>

<soap:Body>
...
  <soap:Fault>
  ...
  </soap:Fault>
</soap:Body>

</soap:Envelope>

SOAPエンベロープ要素

必要なSOAP Envelope要素がSOAPメッセージのルート要素です。 この要素はSOAPメッセージとしてXML文書を定義します。

<?xml version="1.0"?>

<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
  ...
  Message information goes here
  ...
</soap:Envelope>

xmlns:せっけん名前空間

上記の例では石鹸名前空間:のxmlnsに注意してください。 :それはいつもの価値持つべき"http://www.w3.org/2003/05/soap-envelope/"

名前空間は、SOAPエンベロープとしてエンベロープを定義します。

別の名前空間が使用される場合、アプリケーションがエラーを生成し、メッセージを破棄する。


encodingStyle属性

encodingStyle属性は、文書で使用されるデータ型を定義するために使用されます。 この属性は、任意のSOAP要素に表示され、要素の内容とすべての子要素に適用されることがあります。

SOAPメッセージにはデフォルトのエンコーディングを持っていません。

構文

soap:encodingStyle="URI"

<?xml version="1.0"?>

<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
  ...
  Message information goes here
  ...
</soap:Envelope>

SOAPヘッダ要素

オプションのSOAPヘッダー要素は、アプリケーション固有の情報が含まれ(like authentication, payment, etc) SOAPメッセージについてを。

Header要素が存在する場合、それは、Envelope要素の最初の子要素でなければなりません。

Note: Header要素のすべての直接の子要素は名前空間修飾でなければなりません。

<?xml version="1.0"?>

<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">

<soap:Header>
  <m:Trans xmlns:m="http://www.w3ii.com/transaction/"
  soap:mustUnderstand="1">234
  </m:Trans>
</soap:Header>
...
...
</soap:Envelope>

上記の例では、とのヘッダが含まれ"Trans"の要素、 "mustUnderstand" 1の値を持つ属性、および234の値を。

SOAPは、デフォルトの名前空間内の3つの属性を定義します。 これらの属性は、次のとおりでmustUnderstand、俳優、およびencodingStyleを。

SOAPヘッダで定義された属性は、受信者がSOAPメッセージを処理する方法を定義します。


mustUnderstand属性

SOAPのmustUnderstand属性は、ヘッダエントリが、受信者が処理のために必須またはオプションであるかを示すために使用することができます。

あなたはHeader要素の子要素ににmustUnderstand = "1"を追加した場合には、ヘッダを処理する受信機が要素を認識しなければならないことを示しています。 受信機が要素を認識しない場合はヘッダーを処理するとき、それは失敗します。

構文

soap:mustUnderstand="0|1"

<?xml version="1.0"?>

<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">

<soap:Header>
  <m:Trans xmlns:m="http://www.w3ii.com/transaction/"
  soap:mustUnderstand="1">234
  </m:Trans>
</soap:Header>
...
...
</soap:Envelope>

actor属性

SOAPメッセージは、メッセージの経路に沿って別のエンドポイントを通過することによって受信機に送信機から移動することができます。 しかし、SOAPメッセージのすべての部分が最終的なエンドポイントのために意図されるわけではない、代わりに、メッセージパス上のエンドポイントの1つ以上のために意図されていてもよいです。

SOAPのactor属性は、特定のエンドポイントにHeader要素に対処するために使用されます。

構文

soap:actor="URI"

<?xml version="1.0"?>

<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">

<soap:Header>
  <m:Trans xmlns:m="http://www.w3ii.com/transaction/"
  soap:actor="http://www.w3ii.com/appml/">234
  </m:Trans>
</soap:Header>
...
...
</soap:Envelope>

encodingStyle属性

encodingStyle属性は、文書で使用されるデータ型を定義するために使用されます。 この属性は、任意のSOAP要素に表示されることがあり、それはその要素の内容とすべての子要素に適用されます。

SOAPメッセージにはデフォルトのエンコーディングを持っていません。

構文

soap:encodingStyle="URI"

SOAPボディ要素

必要なSOAP Body要素は、メッセージの最終的なエンドポイントを対象とし、実際のSOAPメッセージが含まれています。

SOAP Body要素の直接の子要素は、名前空間で修飾することができます。

<?xml version="1.0"?>

<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">

<soap:Body>
  <m:GetPrice xmlns:m="http://www.w3ii.com/prices">
    <m:Item>Apples</m:Item>
  </m:GetPrice>
</soap:Body>

</soap:Envelope>

上記の例では、リンゴの価格を要求します。 GetPriceとItem要素上記のアプリケーション固有の要素です:メートルがあることに注意してください。 彼らは、SOAP名前空間の一部ではありません。

SOAP応答は次のようになります:

<?xml version="1.0"?>

<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">

<soap:Body>
  <m:GetPriceResponse xmlns:m="http://www.w3ii.com/prices">
    <m:Price>1.90</m:Price>
  </m:GetPriceResponse>
</soap:Body>

</soap:Envelope>


SOAPフォールト要素

任意のSOAPフォールト要素は、エラー・メッセージを示すために使用されます。

SOAPフォールト要素は、SOAPメッセージのエラーとステータス情報を保持します。

Fault要素が存在する場合、それは、本体要素の子要素として現れなければなりません。 Fault要素はSOAPメッセージに一度現れることができます。

SOAP Fault要素は、以下のサブ要素があります。

サブ要素 説明
<faultcode> 障害を識別するためのコード
<faultstring> 障害の人間が読める説明
<faultactor> 障害が発生する原因となっ者に関する情報
<detail>

Body要素に関連するアプリケーション固有のエラー情報を保持しています

SOAPフォルト・コード

障害を記述する際に、以下に定義のfaultcode値はのfaultcode要素で使用する必要があります。

エラー 説明
VersionMismatch SOAP Envelope要素に無効な名前空間を見つけました
MustUnderstand Header要素の直接の子要素、 mustUnderstandに設定された属性"1" 、理解されませんでした
Client メッセージが誤って形成されるか、または不正な情報が含まれていました
Server メッセージを進めることができませんでしたので、サーバーに問題がありました

HTTPプロトコル

HTTPはTCP / IP経由で通信します。 HTTPクライアントはTCPを使用してHTTPサーバーに接続します。 接続を確立した後、クライアントがサーバにHTTPリクエストメッセージを送信することができます。

POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200

サーバは、要求を処理し、クライアントにHTTPレスポンスを送信します。 応答は、要求のステータスを示すステータスコードが含まれています。

200 OK
Content-Type: text/plain
Content-Length: 200

上記の例では、サーバは、これは、HTTPのための標準的な成功コードである200のステータスコードを返しました。

サーバーが要求をデコードすることができなかった場合、それはこのような何かを返すことがありまし:

400 Bad Request
Content-Length: 0

SOAPバインディング

SOAP仕様は、それらが交換されていないか、SOAPメッセージの構造を定義します。 このギャップはと呼ばれるものによって満たされている"SOAP Bindings" 。 SOAPバインディングは、SOAPメッセージを効果的にトランスポートプロトコルを使用して交換することを可能にするメカニズムです。

ほとんどのSOAP実装は、HTTPやSMTPなどの一般的なトランスポートプロトコルのためのバインディングを提供します。

HTTPは、同期および広く使用されています。 Content-TypeとContent-Length:SOAPのHTTPリクエストは、少なくとも2つのHTTPヘッダーを指定します。

SMTPは非同期であり、最後の手段、または特定の場合に使用されています。

SOAPのJava実装は、通常、JMSの特異的結合を提供する(Java Messaging System)プロトコルを。


コンテンツタイプ

SOAPリクエストとレスポンスのContent-Typeヘッダは、メッセージと文字エンコーディングのMIMEタイプを定義し(optional)要求または応答のXMLボディに使用します。

構文

Content-Type: MIMEType; charset=character-encoding

POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8

コンテンツ長

SOAPリクエストとレスポンスのContent-Lengthヘッダは、要求または応答の本文のバイト数を指定します。

構文

Content-Length: bytes

POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250

SOAPの例

以下の例では、GetStockPrice要求がサーバに送信されます。 リクエストはStockNameパラメータ、および応答で返される価格パラメータがあります。 関数の名前空間は、で定義されている"http://www.example.org/stock"

SOAPリクエスト:

POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn

<?xml version="1.0"?>

<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">

<soap:Body xmlns:m="http://www.example.org/stock">
  <m:GetStockPrice>
    <m:StockName>IBM</m:StockName>
  </m:GetStockPrice>
</soap:Body>

</soap:Envelope>

SOAPレスポンス:

HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn

<?xml version="1.0"?>

<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">

<soap:Body xmlns:m="http://www.example.org/stock">
  <m:GetStockPriceResponse>
    <m:Price>34.5</m:Price>
  </m:GetStockPriceResponse>
</soap:Body>

</soap:Envelope>