Simple Object Access Protocol (SOAP)

Simple Object Access Protocol (SOAP) は XML ベースの軽量プロトコルで、非集中的な分散アプリケーション環境で情報を交換するために使用されます。 クライアントとサーバーが同じメソッドを使用していれば、アプリケーションに必要な任意の方法で SOAP メッセージを転送できます。 最新の仕様では、単一の転送プロトコルバインド (HTTP) のみが記述されています。

SOAP はインターネット アプリケーションの世界に完全に合致しており、将来的にはアプリケーション サービスのためのインターネットの相互運用性を改善すると考えられています。 基本的に、SOAP はメソッド呼び出しを XML 文字列にパッケージ化し、HTTP を介してコンポーネント インスタンスに配信します。

SOAP XML ドキュメントはルート要素、値を持つ子要素、その他の仕様に構造化されます。 まず、リクエスト (呼び出されるメソッドおよびパラメータ) が含まれる XML ドキュメントが送信されます。 サーバーは、結果が含まれる対応する XML ドキュメントで応答します。

SOAP は Microsoft の技術を基盤にしていません。 これは、UserLand、Ariba、Commerce One、Compaq、Developmentor、HP、IBM、IONA、Lotus、Microsoft、SAP が起草したオープンな基準です。 SOAP 1.1 は、2000 年 5 月の W3C で、公式のインターネット標準として紹介されました。 Microsoft は SOAP 最大の支持者の 1 つであり、SOAP は標準のインターフェイスとして .NET アーキテクチャに組み込まれました。

SOAP スタック (クライアント側の SOAP 標準の実装) は、ライブラリーと、ヘルパー関数を提供するクラスで構成されます。 Web サービス テストの大きな課題は、相互に互換性のない SOAP スタック実装が多数存在することです。 SOAP はプラットフォームや技術に依存しないことを目的としていますが、実際は異なります。 ただし、.NET で記述されている Web サービスは常に .NET クライアントと互換性を持ちます。つまり、これらは同じ SOAP スタックまたはライブラリーを使用しています。 しかし、.NET Web サービスをテストする場合は、サービスが他の SOAP スタック実装 (Java SOAP スタックなど) と互換性を持つかどうかを確認し、相互操作性の問題を回避する必要があります。

SOAP クライアント リクエストは、HTTP POST パッケージまたは M-POST パッケージにカプセル化されます。 次の例は、インターネット仕様案の抜粋です。

呼び出しのサンプル

POST /StockQuote HTTP/1.1
Host: www.stockquoteserver.com
Content-Type: text/xml;
charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"
<?xml version="1.0"?>
<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <m:GetLastTradePrice xmlns:m="Some-URI">
      <symbol>DIS</symbol>
    </m:GetLastTradePrice>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

コードの最初の 4 行は標準の HTTP です。 POST は HTTP 動詞であり、すべての HTTP メッセージに必要です。 Content-Type フィールドと Content-Length フィールドは、ペイロードが含まれるすべての HTTP メッセージに必要となります。 コンテンツ タイプ text/xml は、ペイロードがサーバー、またはアプリケーション ヘッダーをスキャンすることができるファイアウォールへの XML メッセージであることを表します。

追加の HTTP ヘッダー SOAPAction は HTTP ベースの SOAP メッセージに必須であり、それを使用することで SOAP HTTP リクエストの意図を伝えることができます。 値は URI であり、意図を指定します。 SOAPAction ヘッダー フィールドのコンテンツをファイアウォールなどのサーバーが使用すると、HTTP 内の SOAP リクエスト メッセージを適切にフィルタすることができます。 ヘッダー フィールドが空の文字列 ("") の場合、SOAP メッセージの意図は HTTP リクエスト URI によって提供されることを表します。 つまり、値がないことは、メッセージの意図の提示がないことを表します。

XML コードは単純です。 要素 Envelope および Body が汎用のペイロード パッケージ化メカニズムを提供します。 要素 GetLastTradePrice には symbol と呼ばれる要素が含まれ、そこには証券コードが含まれます。 このリクエストの目的は、特定の株式 (この場合はディズニー (DIS)) の最新の取り引き価格を取得することにあります。

このメッセージを送信するプログラムに必要なのが、SOAP 準拠の XML メッセージにリクエストをフレーム化する方法と、HTTP を介してそれを送信する方法を理解することです。 次の例では、プログラムに株式価格のリクエストのフォーマット化の方法を指示しています。 メッセージを受信する HTTP サーバーは、HTTP ヘッダー SOAPAction を認識することで、それが SOAP メッセージであることを理解します。 その後サーバーがメッセージを処理します。

SOAP は 2 種類のメッセージ、呼び出しおよびレスポンスを定義しており、それによりクライアントはリモート プロシージャをリクエストし、サーバーはそのようなリクエストに応答することができます。 前述の例は、呼び出しの例です。 次の例は、呼び出しに対するレスポンスです。

レスポンスのサンプル

HTTP/1.1 200 OK
Content-Type: text/xml;
charset="utf-8"
Content-Length: nnnn
<?xml version="1.0"?>
<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  <SOAP-ENV:Body>
    <m:GetLastTradePriceResponse xmlns:m="Some-URI">
      <Price>34.5</Price>
    </m:GetLastTradePriceResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

コードの最初の 3 行は標準の HTTP です。 最初の行は前の POST リクエストに対するレスポンス コードを表しており、2 行目と 3 行目はコンテンツ タイプを、4 行目がレスポンスの長さを表しています。

XML ヘッダーで、実際の SOAP ペイロードが囲まれています。 XML 要素 GetLastTradePriceResponse には、取り引き価格のリクエストに対するレスポンスが含まれています。 子要素は Price であり、リクエストに返された値を表しています。