株式会社ジオデータ開発 ロゴ
株式会社ジオデータ開発GEO DATA DEVELOPMENT Inc.

WEB SERVICES / SYSTEM INTEGRATION

SOAPとは? RPCからわかるWebサービスの仕組み

ネット通販で「在庫あり」と表示されるまで、実は別のシステムに問い合わせているかもしれません。その会話を、具体的なXMLを見ながら理解しましょう。

身近な場面:ネット通販の裏側にある3つのシステム

コーヒー豆をネットショップで注文するとき、「在庫あり」「注文を受け付けました」「明日発送予定」と表示されます。1つの画面に見えますが、裏側では通販サイト・在庫管理・配送管理という別々のシステムが動いていることがあります。

🛒 通販サイト

お客さんが商品を選ぶ画面。購入ボタンを押せるか判断したい。

📦 在庫管理システム

倉庫の在庫数を管理。「このコーヒー豆は何個残っている?」に答える。

🚚 配送管理システム

送り状の作成や出荷を担当。「2個送って」と依頼を受ける。

通販サイトが倉庫システムに電話できるわけではありません。そこでシステム同士が決められた形式で依頼と結果を送り合う必要があります。SOAPは、そのとき使えるメッセージの形式と処理ルールを定めた仕組みです。

この記事の「COFFEE-01」などの商品コード、URL、レスポンスは仕組みを学ぶための架空の例です。SOAPは現実にも使われますが、すべての通販サイトがSOAPを利用しているわけではありません。

そもそもAPIとは? ――システムの「受付窓口」

API(Application Programming Interface)は、ソフトウェアが別のソフトウェアの機能を利用するための取り決めです。たとえば通販サイトは「在庫数を返す」という窓口に、商品コードを渡します。

依頼する側(クライアント)

「COFFEE-01の在庫はいくつ?」と指定された窓口に問い合わせる。

答える側(サーバー)

商品コードをもとにデータベースを調べ、「12個」と結果を返す。

APIは必ずしもネットワーク越しではありません。自分のプログラム内のライブラリ関数を呼ぶのもAPIです。Web APIは、HTTPなどを利用してネットワーク経由で使うAPIを指します。

RPC:離れたコンピュータの処理を呼ぶ

RPC(Remote Procedure Call)は、別のコンピュータにある処理を、関数や手続きを呼ぶように依頼する考え方です。RPCはSOAPだけの用語ではなく、gRPCやJSON-RPCなどにも共通します。

同じコンピュータの関数なら

const stock = getStock("COFFEE-01");
// stock = 12

別のコンピュータの処理なら

通販サイト
「GetStockを実行して」 →
← 「結果は12」
在庫管理サーバー

大切なのは、ローカル関数と違って、RPCではネットワーク障害・タイムアウト・相手側のエラーが起こることです。「配送依頼の返事が来なかったから再送したら、同じ商品が二重に出荷された」という問題もあり得ます。RPCだから自動的に安全・確実というわけではありません。

厳密な区別:RPCは「遠くの処理を呼び出す方式」。SOAPは「XMLでメッセージを構成・処理するための枠組み」です。SOAPにはRPC向けの表現規約もありますが、業務文書を交換するdocument-styleの使い方もあります。「SOAP=RPC専用」は正確ではありません。

XML:データの意味をタグで示す

SOAPメッセージはXMLで表します。XML(Extensible Markup Language)は、データのまとまりに名前を付けて表現する書き方です。HTMLと形は似ていますが、画面表示ではなく意味のある構造化データを伝える目的で使われます。

<product>
  <code>COFFEE-01</code>
  <quantity>2</quantity>
</product>

ここでは「商品コードはCOFFEE-01、個数は2」と読めます。開始タグと終了タグを対応させ、1つのルート要素の下に内容を入れます。xmlnsは名前空間と呼び、別の組織が同じタグ名を使っても区別できるようにします。

XMLのメリット

人間も構造を読みやすく、スキーマを使って項目や型を規定できる。

XMLの注意点

JSONより長くなりやすい。解析では外部実体(XXE)や過剰なリソース消費への対策も必要。

SOAPは「書式が決まった封筒」

封筒で手紙を送るとき、差出人の情報や本文などの置き場が決まっていると扱いやすくなります。SOAPにも「大きな封筒」を表すEnvelopeがあり、その中にHeaderとBodyを入れます。

Envelope — メッセージ全体
Header(任意)

認証情報、追跡用ID、処理の制御情報などを置くための拡張領域。

Body(必須)

「商品コードCOFFEE-01の在庫を調べる」など、受信側に届ける業務データ。

GetStock(productCode=COFFEE-01)

SOAPは、XMLをどのように包むかだけでなく、Headerの処理やエラー(Fault)の表し方も定めています。ただし、業務操作の名前や、誰にどんな権限を与えるかまでSOAPが自動的に決めるわけではありません。

在庫を問い合わせるときのリクエストとレスポンス

通販サイトが「COFFEE-01の在庫数を知りたい」と依頼するSOAP 1.2メッセージの例です。上部はHTTPリクエスト、空行より下がSOAPのXMLです。

POST /InventoryService HTTP/1.1
Host: inventory.example.com
Content-Type: application/soap+xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
  xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
  xmlns:inv="https://example.com/inventory">
  <soap:Header>
    <inv:ClientId>online-shop</inv:ClientId>
  </soap:Header>
  <soap:Body>
    <inv:GetStock>
      <inv:productCode>COFFEE-01</inv:productCode>
    </inv:GetStock>
  </soap:Body>
</soap:Envelope>

① Envelope

「これはSOAPメッセージです」という入れ物。名前空間URIでSOAPのバージョンも識別できます。

② Header

ここでは架空のクライアント識別子です。識別子を書くだけで本人確認が完了するわけではありません。

③ Body

GetStockという操作名と、productCodeという引数が載っています。

在庫管理システムが処理に成功したら、たとえば次のXMLを返します。

<?xml version="1.0"?>
<soap:Envelope
  xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
  xmlns:inv="https://example.com/inventory">
  <soap:Body>
    <inv:GetStockResponse>
      <inv:availableQuantity>12</inv:availableQuantity>
    </inv:GetStockResponse>
  </soap:Body>
</soap:Envelope>

通販サイトはavailableQuantityの値「12」を取り出し、商品ページに「在庫あり」と表示できます。このように、呼び出し → XML送信 → サーバーで処理 → XML応答がひと続きになります。

Headerは処理に必要な付加情報を記述する場所です。たとえば「このメッセージをどのように扱うか」を伝えます。SOAP 1.2にはmustUnderstand属性があり、対象ノードが必須のHeaderブロックを理解できないときはFaultを返すなどのルールがあります。

Bodyは主に業務データを入れる場所ですが、エラーが起きた場合にはBody内にSOAP Faultを格納します。商品コードが不正な場合なら、次のようなイメージです。

<soap:Body>
  <soap:Fault>
    <soap:Code>
      <soap:Value>soap:Sender</soap:Value>
    </soap:Code>
    <soap:Reason>
      <soap:Text xml:lang="ja">商品コードが不正です</soap:Text>
    </soap:Reason>
  </soap:Fault>
</soap:Body>

SOAP 1.2のFaultにはCodeとReasonなどがあり、SOAP 1.1のFaultではfaultcodeやfaultstringが使われます。単に「HTTPエラーが返った」と考えず、HTTPの状態とSOAP Faultの両方を確認するのが重要です。

SOAP 1.1とSOAP 1.2は名前空間、HTTP Content-Type、Fault構造などが異なります。2つを機械的に同じものとして扱うと接続に失敗します。

WSDL:外部システムの「取扱説明書」

ここまで見たXMLを、毎回担当者同士が口頭で決めたら大変です。そこでSOAPベースのWebサービスでは、サービスのインターフェースを定義するWSDL(Web Services Description Language)がよく使われます。

何ができる?

GetStockやCreateShipmentなどの操作、入出力のメッセージやデータ型を記述します。

どこへ送る?

具体的なプロトコルへの結び付け(binding)と、サービスの接続先(endpoint)を表現します。
<wsdl:operation name="GetStock">
  <wsdl:input message="tns:GetStockInput"/>
  <wsdl:output message="tns:GetStockOutput"/>
</wsdl:operation>

上の断片はWSDL 1.1の操作定義を簡略化したものです。WSDLの定義からクライアント用コードを生成できる開発環境もあり、大規模な企業システムで採用されてきました。

SOAPのXMLとWSDLは別物です。SOAPは実際に送るメッセージ、WSDLはそのメッセージやサービスの仕様書と捉えると整理できます。また、WSDLなしでSOAPを使う構成もあります。

HTTP・SOAP・RPCは同じ階層のものではない

混同しやすい3つを、配送業者に荷物を頼む例で分けましょう。

RPC:何をしたい?

離れた場所の人に「在庫を調べて」という作業を依頼する発想。

SOAP:どう書く?

依頼と結果を、Envelope・Bodyなどの決まったXML形式で表す。

HTTP:どう運ぶ?

Web通信のリクエスト・レスポンスとしてメッセージを運ぶ手段のひとつ。

SOAPはHTTPに載せる使い方が代表的ですが、SOAP自体はHTTP専用の規格ではありません。またSOAPの全利用がRPC形式とは限らず、文書形式の交換もあります。

言葉役割例
RPC離れた処理を呼ぶ考え方GetStock("COFFEE-01")
SOAPXMLメッセージの形式・処理規則Envelope / Header / Body / Fault
HTTPWeb向けの通信プロトコルPOST /InventoryService
WSDLサービスのインターフェース記述操作名・メッセージ・接続先

操作して確かめる:SOAPメッセージを作ってみよう

操作する業務を「在庫照会」から「配送依頼」に変えたらBodyはどう変わるでしょうか? 商品コードを「UNKNOWN」にした場合や、処理失敗を選んだ場合には何が返るでしょうか? XMLを実際に見比べてください。

INTERACTIVE LAB

通販サイトから別システムへ、SOAPで依頼してみよう

ネットワークへは送信せず、選んだ条件からXMLをブラウザ内で生成する学習用シミュレーターです。

処理を追う1 / 5

① 商品ページがAPIを呼ぶ

通販サイトが配送・在庫システムの GetStock を呼ぶと決めます。これは別のコンピュータ上の処理を依頼するRPCの考え方です。

送信するSOAP XML

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:m="https://example.com/store/ws">
  <soap:Header>
    <m:ClientId>shop-front</m:ClientId>
  </soap:Header>
  <soap:Body>
    <m:GetStock>
      <m:productCode>COFFEE-01</m:productCode>
    </m:GetStock>
  </soap:Body>
</soap:Envelope>

返ってくるSOAP XML

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:m="https://example.com/store/ws">
  <soap:Body>
    <m:GetStockResponse>
      <m:availableQuantity>12</m:availableQuantity>
    </m:GetStockResponse>
  </soap:Body>
</soap:Envelope>

HTTPの目安:Content-Type: application/soap+xml; charset=utf-8。このラボのHeader識別子は認証を実装するものではありません。実システムではTLS、認証・認可、入力検証、XMLの安全な解析が必要です。

REST APIとの違い:「処理」を呼ぶか「資源」を操作するか

最近よく見かけるREST風のWeb APIでは、商品というリソースをURLで表し、HTTPのGET・POSTなどを使って操作します。比較のため、同じ在庫照会を並べてみます。

SOAPを使ったRPC風の例

POST /InventoryService

BodyにGetStockとproductCodeを書いたXMLを送る。

REST風APIの例

GET /products/COFFEE-01/stock

JSON形式の{"availableQuantity":12}が返る、という設計ができる。

ただしこれは典型的な設計例です。SOAPだから必ず操作型、RESTだから必ずJSONという決まりではありません。RESTはアーキテクチャスタイルであり、SOAPと同じ層の単一プロトコルではありません。

観点SOAPサービスの代表例REST風のWeb API
データ形式XML(SOAP Envelope)JSONが多いが固定ではない
インターフェース定義WSDLを利用する構成が多いOpenAPIなどが利用される
業務の表現操作名・XMLメッセージURL・HTTPメソッド
エラーSOAP FaultHTTPステータスと応答本文
採用場面既存の企業間連携、契約重視のサービスなどWeb・モバイル向け公開APIなど

実際の選択は、既存システムとの互換性、相手企業の仕様、セキュリティ要件、運用ツールなどで決まります。SOAPを「古いから不要」と切り捨てず、相手がどの契約で通信しているかを見ることが大切です。

SOAPを使えば通信が自動的に安全になる?

なりません。SOAPはメッセージ形式と処理の枠組みなので、それ自体で機密性、送信元の認証、業務権限の確認がすべて提供されるわけではありません。

① HTTPS / TLS

通信経路の盗聴・改ざんを防ぐために利用する。証明書の確認も必要。

② 認証と認可

誰が接続しているかと、どの操作を許してよいかは別々に確認する。

③ WS-Security

SOAPメッセージに署名や暗号化などの仕組みを付加する仕様群。TLSとは守る対象・範囲が異なる。

④ XMLを安全に解析

XXE対策、メッセージサイズの上限、スキーマ・入力検証を行う。外から届くXMLは信頼しない。

たとえば出荷APIに対して、quantity=999999と送られても無条件で処理してはいけません。また、配送依頼がタイムアウトしたときにむやみに再送すると二重処理が起こるため、重複排除用IDなどの設計も重要です。

送信元認証と機密性は別:SOAP HeaderにClientIdがあっても、それだけでは本当にその企業から来たとは証明できません。TLS・適切な認証方式・認可・ログ監査を組み合わせます。

全体をもう一度つなぐ

1. RPCを理解する

別のコンピュータの処理を依頼する考え方。ネットワーク障害に備える必要がある。

2. SOAPを理解する

Envelopeで包んだXMLメッセージ。Headerは付加情報、Bodyは主な内容、Faultはエラー。

3. WSDLを理解する

どんな操作・データ形式・接続先を使うかを機械可読で記述できる。

4. Webサービスを理解する

SOAPをHTTPで運ぶ構成が代表的。安全性はTLS、認証・認可、XML検証などで補う。

ネットショップで「在庫を調べる」という日常の小さな操作が、RPCという発想、SOAPというメッセージのルール、XMLという表現、HTTPという通信手段を組み合わせて実現されることが分かれば、企業間のシステム連携も読み解きやすくなります。

参考仕様:本文のSOAP 1.2 Envelope・Header・Body・FaultはW3C SOAP 1.2仕様、WSDLの説明はW3C WSDL仕様を参照しています。XMLとHTTPのコードは教育用に単純化した架空のサービスです。