XML Soap
- SOAPは、S imple O bject A ccess Protocolの略です。
- SOAPはアプリケーション通信プロトコルです
- SOAPは、メッセージを送受信するための形式です。
- SOAPはプラットフォームに依存しません
- SOAPはXMLに基づいています
- SOAPはW3C勧告です
なぜSOAPなのか?
Webアプリケーションがインターネットを介して通信できることが重要です。
HTTPはすべてのインターネットブラウザとサーバーでサポートされているため、アプリケーション間で通信するための最良の方法はHTTPを介することです。これを実現するためにSOAPが作成されました。
SOAPは、さまざまなテクノロジーとプログラミング言語を使用して、さまざまなオペレーティングシステムで実行されているアプリケーション間で通信する方法を提供します。
SOAPビルディングブロック
SOAPメッセージは、次の要素を含む通常のXMLドキュメントです。
- XMLドキュメントをSOAPメッセージとして識別するエンベロープ要素
- ヘッダー情報を含むヘッダー要素
- 呼び出しおよび応答情報を含むBody要素
- エラーとステータス情報を含む障害要素
上記のすべての要素は、SOAPエンベロープのデフォルトの名前空間で宣言されています。
http://www.w3.org/2003/05/soap-envelope/
また、SOAPエンコーディングとデータ型のデフォルトの名前空間は次のとおりです。
http://www.w3.org/2003/05/soap-encoding
構文規則
重要な構文規則は次のとおりです。
- SOAPメッセージはXMLを使用してエンコードする必要があります
- SOAPメッセージはSOAPEnvelope名前空間を使用する必要があります
- 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エンベロープ要素
必要なSOAPEnvelope要素は、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">
...
Message information goes here
...
</soap:Envelope>
xmlns:soap名前空間
上記の例のxmlns:soap名前空間に注意してください。常に「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ヘッダー要素には、SOAPメッセージに関するアプリケーション固有の情報(認証、支払いなど)が含まれています。
Header要素が存在する場合、それはEnvelope要素の最初の子要素である必要があります。
注: 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="https://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
上記の例には、「Trans」要素、値1の「mustUnderstand」属性、および値234のヘッダーが含まれています。
SOAPは、デフォルトの名前空間に3つの属性を定義します。これらの属性は、mustUnderstand、actor、およびencodingStyleです。
SOAPヘッダーで定義された属性は、受信者がSOAPメッセージを処理する方法を定義します。
mustUnderstand属性
SOAP mustUnderstand属性を使用して、受信者が処理するヘッダーエントリが必須かオプションかを示すことができます。
mustUnderstand = "1"をHeader要素の子要素に追加すると、Headerを処理するレシーバーが要素を認識しなければならないことを示します。受信者が要素を認識しない場合、ヘッダーの処理時に失敗します。
構文
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="https://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
アクター属性
SOAPメッセージは、メッセージパスに沿ってさまざまなエンドポイントを渡すことにより、送信者から受信者に移動する場合があります。ただし、SOAPメッセージのすべての部分が最終的なエンドポイントを対象としているわけではなく、メッセージパス上の1つ以上のエンドポイントを対象としている場合があります。
SOAPアクター属性は、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="https://www.w3schools.com/transaction/"
soap:actor="https://www.w3schools.com/code/">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
encodingStyle属性
encodingStyle属性は、ドキュメントで使用されるデータ型を定義するために使用されます。この属性は任意のSOAP要素に表示される可能性があり、その要素のコンテンツとすべての子要素に適用されます。
SOAPメッセージにはデフォルトのエンコーディングはありません。
構文
soap:encodingStyle="URI"
SOAPボディ要素
必要なSOAPBody要素には、メッセージの最終エンドポイントを対象とした実際の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="https://www.w3schools.com/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
上記の例では、リンゴの価格を要求しています。上記のm: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="https://www.w3schools.com/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
SOAP障害要素
オプションのSOAPFault要素は、エラーメッセージを示すために使用されます。
SOAP Fault要素は、SOAPメッセージのエラーとステータス情報を保持します。
Fault要素が存在する場合は、Body要素の子要素として表示される必要があります。障害要素は、SOAPメッセージに1回だけ表示されます。
SOAP障害要素には、次のサブ要素があります。
Sub Element | Description |
---|---|
<faultcode> | A code for identifying the fault |
<faultstring> | A human readable explanation of the fault |
<faultactor> | Information about who caused the fault to happen |
<detail> |
Holds application specific error information related to the Body element |
SOAP障害コード
以下に定義されているフォールトコード値は、フォールトを記述するときにフォールトコード要素で使用する必要があります。
Error | Description |
---|---|
VersionMismatch | Found an invalid namespace for the SOAP Envelope element |
MustUnderstand | An immediate child element of the Header element, with the mustUnderstand attribute set to "1", was not understood |
Client | The message was incorrectly formed or contained incorrect information |
Server | There was a problem with the server so the message could not proceed |
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
上記の例では、サーバーは200のステータスコードを返しました。これはHTTPの標準の成功コードです。
サーバーがリクエストをデコードできなかった場合は、次のようなものが返されている可能性があります。
400 Bad Request
Content-Length: 0
SOAPバインディング
SOAP仕様は、SOAPメッセージの交換方法ではなく、SOAPメッセージの構造を定義します。このギャップは、いわゆる「SOAPバインディング」によって埋められます。SOAPバインディングは、トランスポートプロトコルを使用してSOAPメッセージを効果的に交換できるようにするメカニズムです。
ほとんどのSOAP実装は、HTTPやSMTPなどの一般的なトランスポートプロトコルのバインディングを提供します。
HTTPは同期的であり、広く使用されています。SOAP HTTPリクエストは、少なくとも2つのHTTPヘッダー(Content-TypeとContent-Length)を指定します。
SMTPは非同期であり、最後の手段または特定の場合に使用されます。
SOAPのJava実装は通常、JMS(Javaメッセージングシステム)プロトコルに特定のバインディングを提供します。
コンテンツタイプ
SOAP要求および応答のContent-Typeヘッダーは、メッセージのMIMEタイプと、要求または応答の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パラメータと、レスポンスで返されるPriceパラメータがあります。関数の名前空間は「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>