SOAP (プロトコル)

**SOAP**（ソープ）は、コンピュータネットワーク内のWebサービスの実装において、構造化された情報を交換するための通信プロトコルの仕様である。拡張性、中立性、独立性を導入することを目的とする。XML-RPCから発展した、**XML [[Webサービス]]**のための、XMLベースのRPCプロトコルである。

メッセージ形式としてXMLインフォメーションセットを使用する。また、メッセージのネゴシエーションおよび伝送はアプリケーション層のプロトコル（多くの場合HTTPまたはSMTP）に依存する。

SOAPにより、全く異なるオペレーティングシステム（例えばWindowsとLinux）上で走っているプロセス間でもXMLを使って意思疎通が可能になる。HTTPのようなWebプロトコルは全てのオペレーティングシステムにインストールされて走っているので、SOAPの仕組みを使えば、クライアントはその言語やプラットフォームが何であれ、ウェブサービスを起動してレスポンスを受け取ることが出来る。

元はSimple Object Access Protocolの頭字語とされていたが、現在は「何かの頭字語ではない」とされている。

## 概要
拡張可能で分散的なフレームワークであり、HTTP以外にも様々なコンピュータネットワークの通信プロトコルで利用することができると主張され、SMTPへのバインディングも示されているが、実際上TCP/IP上のHTTP(S)以外の使用は現実的ではない。主要な実装としてApache Axisがある。多くの実装の間で相互運用性に問題があるとしてWS-Iというコンソーシアムが作られたが、現在はOASISの一部となっている。

いくつかのSOAPメッセージを相互作用させることによってリモートプロシージャコールが実現できる、Webサービスに有効な手段の一つである、などと主張されている。

メッセージの表現にXMLを使用する。メッセージはヘッダとボディから成る。ヘッダはオプショナルであり、ルーティングやセキュリティ、そして トランザクションなどのための情報といったメタ情報を格納する。ボディは、主要な情報すなわちペイロードである。

相互運用性のためにはXML Schemaなどで、なんらかのスキーマを定義することが望ましいであろう。また、WSDLという記述言語がある。

「WS-*」と総称される関連プロトコルが多量にある。

## 特徴
SOAP はウェブサービスのための「Web services protocol stack」における「Messaging Protocol」層を提供する。SOAPはXMLを基盤とするプロトコルで、三つの部分で構成される：
* 「envelope」(小包)。これはメッセージ構造を定義する。また、どのようにこれを処理すべきかを定義する：
* アプリケーションで定義されるデータ型のインスタンスを表現するためのエンコーディング規則
* プロシージャ呼出しとレスポンスを表すための約束事

SOAPには三つの大きな特徴がある:

#*拡張性* (セキュリティやWS-Addressingなどは開発中の拡張機能である)
#*中立性* (SOAPはHTTP, SMTP, TCP, , JMSなどのいかなるプロトコル上でも運用できる)
#*独立性* (SOAPはいかなるプログラミングモデルでも使える)

SOAPで出来ることの一例を挙げると、たとえば或るアプリケーションが、ウェブサービス（例えば不動産価格データベース）を利用可能なサーバに、検索条件パラメータを入れたSOAPリクエストを送ったとする。すると、そのサーバーはSOAPレスポンス（価格、場所、特徴などの検索結果データを書き込んだXML形式文書）を返してくる。返ってきたデータは標準化された機械処理可能な書式で来るので、それを受け取ったアプリケーションはそのデータを直接処理できる。

SOAPアーキテクチャには、次の幾つかレイヤーのための仕様がある:

* メッセージ形式
* メッセージ交換パターン(Message Exchange Pattern : MEP)
* 下層のトランスポートプロトコルとの結合
* メッセージ処理モデル
* プロトコル拡張性

## 仕様
SOAPはW3Cにより標準化されている。以下は具体的な仕様である。

### SOAP processing model
**SOAP processing model** はSOAPが採用する分散型メッセージ処理モデルである。

分散コンピューティングを指向するSOAPでは「ネットワーク上に存在するノードがメッセージを送り合いながら処理をおこない最終結果を得る」という処理モデルを取っている。これが SOAP processing model である。

### SOAP message
**SOAP message** はノード間の情報伝達における基本単位である。SOAP message はドキュメント直下に`<Envelope>`要素を持ち、その下に`<Header>`要素と`<Body>`要素が配置される（図参照）。

`<Header>`要素は0個以上の **header block** からなる。各header blockは名前付き要素であり、属性をもつ。仕様では `encodingStyle` / `role` / `mustUnderstand` / `relay` の4属性が定義されている。block の `role`属性はノードの role と結びついており、その header block がノードをターゲットとすると呼ばれる。

`<Body>`要素のコンテンツは要素ツリーであり、その具体的中身（利用可能な要素、木構造）は各サービスで定義される。

### SOAP Node
**SOAP Node** はメッセージ処理を担うノードである。

processing model における出発ノードを **initial SOAP sender**、中間ノードを **SOAP intermediary**、終着ノードを **ultimate SOAP receiver** という。各ノードが担う役割を **SOAP roles** という。仕様では `next` / `none` / `ultimateReceiver` の3つの role name を定める。終着ノードはメッセージのbodyを処理する責務を負う。中間ノードはそのroleに基づき header block の処理を担う。

### その他

**[https://www.w3.org/TR/soap12-part1/#extensibility *'SOAP extensibility model**]'' ：SOAP機能とSOAPモジュールの概念を定義する
* ''[https://www.w3.org/TR/soap12-part1/#transpbindframew **SOAP underlying protocol binding*']* ：SOAPノード間でSOAPメッセージを交換するために用いる下層プロトコルへの結合を定義するための規約を示したフレームワーク。

## SOAPメッセージの例
一例として、あるクライアントが、ショッピングサイト（例示のための架空のものである）のサービスに商品IDを提示して商品の詳細を求めるリクエストメッセージはおおよそ以下のようになる。

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Body>
     <getProductDetails xmlns="http://warehouse.example.com/ws">
       <productId>827635</productId>
     </getProductDetails>
   </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>
```

これに対し、ショッピングサイトのサービス側の、要求に基づく商品データを含むレスポンスメッセージはおおよそ以下のようになる。

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Body>
     <getProductDetailsResponse xmlns="http://warehouse.example.com/ws">
       <getProductDetailsResult>
         <productName>Toptimate 3-Piece Set</productName>
         <productId>827635</productId>
         <description>3-Piece luggage set.  Black Polyester.</description>
         <price>100.50</price>
         <inStock>true</inStock>
       </getProductDetailsResult>
     </getProductDetailsResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```


## 関連項目

*WDDX
*WS-Addressing

## 外部リンク
*SOAP Version 1.2 (W3C)

## 脚注