SOAPの仕組み


   続いてはSOAPを利用したWeb APIについて見ていくことにしましょう。SOAPはSimple Object Access Protocolの略で、XML-RPCと同じようにネットワーク越しにサービスを呼び出すためのデータのやり取りを決めた仕様です。ただしSOAPはXML-RPCと違って、やり取りはHTTPだけでなく、ほかのプロトコルも使うことができるようになっています。

   SOAPの仕様の策定には、XML-RPCを作ったたDave Winer氏も関わっており、シンプルなXML-RPCに、より多くの拡張性を持たせたものだということもできます。

   SOAPでは、XML-RPCと同様にHTTPのPOSTメソッドを利用してXMLデータのやり取りを行います。ただしやり取りされるXMLデータは、XML-RPCよりもやや複雑です。

   まずはサンプルを見てみましょう(リスト12)。
リスト12:SOAPのリクエストメッセージ
<?xml version='1.0' encoding='UTF-8'?>
<env:Envelope
   xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/1999/XMLSchema">
  <env:Header>
    <t:transaction
       xmlns:t="http://api.example.org/transaction"
       env:encodingStyle="http://example.com/encoding"
       env:mustUnderstand="true">5</t:transaction>
  <env:/Header>
  <env:Body>
    <m:exampleMethod
       xmlns:m="http://api.example.org/"
       env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <name xsi:type="xsd:string">Taro Yamada</name>
      <id xsi:type="xsd:int">3232</id>
    </m:exampleMethod>
  </env:Body>
</env:Envelope>

   SOAPのデータのルート要素はEnvelopeです。envelopeは「封筒」という意味で、メッセージ全体をくるむ封筒の役割をする、という意味がこめられています。

   そしてSOAPのデータ全体は、ヘッダー(Header)とボディ(Body)に分かれています。これはちょうどHTTPのヘッダーとボディとよく似ていて、実際に送信するデータをボディに、そしてセッションの保持などの送受信に関する情報や付加情報などをヘッダーに入れることになっています。ただし、ヘッダーは省略可能で、ヘッダーをまったく付けなくても、SOAPの仕様的には正しいものです。

   Body要素の中には、呼び出すメソッド名とパラメータの情報が入ります。記述方法は比較的シンプルで、メソッド名の要素の中にパラメータ名の要素が列挙され、そこにパラメータが入る、というものです。上記のサンプルの場合は呼び出すメソッド名は「exampleMethod」であり、中のパラメータは「name」と「id」ということになります。

   それに対するレスポンスは前ページのリスト13のようなデータになります。

リスト13:SOAPのレスポンスメッセージ
<?xml version='1.0' encoding='UTF-8'?>
<env:Envelope
      xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/1999/XMLSchema">
  <env:Header>
    <t:transaction
           xmlns:t="http://api.example.org/transaction"
           env:encodingStyle="http://example.com/encoding"
           env:mustUnderstand="true">5</t:transaction>
  <env:/Header>
  <env:Body>
    <m:exampleMethodResponse
         xmlns:m="http://api.example.org/"
         env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <count xsi:type="xsd:int">132</count>
    </m:exampleMethodResponse>
  </env:Body>
</env:Envelope>

   Envelopeによって全体が包まれていて、HeaderとBodyがあるところまではリクエストデータと同じです。Bodyの中の要素名は「メソッド名+Response」になります。

   そしてその中には、戻り値がやはりパラメータ名を要素名として記述されています。戻り値は1つに限られてはいません。

   ちなみに、SOAPはW3Cによって標準化が行われており、現在の最新版は1.2です。詳しい仕様については以下のページを参照してください。


   なお、ここで紹介したサンプルはHTTPのPOSTメソッドを利用していますが、アクセスの結果サーバー側のデータに影響を与えないものであれば、GETメソッドを利用してのアクセスも可能であると定義されています。

   SOAPと同時によく利用される仕組みに「WSDL」があります。これはWeb Services Description Languageの略で、Webサービス、つまりはWeb APIの仕様を記述するためのデータ形式です。WSDL自体はXMLで記述されており、ある公開されているWeb APIがどんなメソッドを公開しているのか、アクセスすべきURIはどこか、渡すべきパラメータは何か、戻り値は何か、利用すべき名前空間は何か、といったことが記述されています。したがって、WSDLを読み込むことで、プログラムはそのAPIの利用方法を自動的に知ることができるようになります。つまり、リクエストデータを自分で生成しなくても、どのメソッドを呼び出して、どのパラメータに何を渡すかを指定すれば、自動的にリクエストデータを生成してAPIを利用できるようになります。

   WSDLのサンプルをリスト14に示します。これはGoogleが公開している検索APIのWSDLを抜粋したものです。

リスト14:WDSLのサンプル
<?xml version="1.0"?>
<definitions name="GoogleSearch"
             targetNamespace="urn:GoogleSearch"
             xmlns:typens="urn:GoogleSearch"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
             xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
             xmlns="http://schemas.xmlsoap.org/wsdl/">
  <types>
    <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
                targetNamespace="urn:GoogleSearch">
  

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30