XMLを使った通信プロトコルを完全解説!SOAPからRESTまで

Web

「XMLを使って通信するって、どういうこと?」
「SOAPとかXML-RPCって聞いたことあるけど、何が違うの?」

インターネット上でデータをやり取りする際、XMLを使った通信プロトコルが広く使われています。WebサービスやAPIの世界では、XMLは長年にわたって重要な役割を果たしてきました。

この記事では、XMLを使った主要な通信プロトコルについて、基本から実践まで詳しく解説していきます。それぞれの特徴や使い分けを理解すれば、適切な技術選択ができるようになりますよ。

スポンサーリンク

XMLと通信プロトコルの関係

まず、基本的な概念から説明しますね。

通信プロトコルとは

通信プロトコルとは、コンピューター同士がデータをやり取りする際の「約束事」のことです。

例えるなら:

  • 言語の文法ルールのようなもの
  • 「こういう形式でデータを送る」という取り決め
  • 送信側と受信側が同じルールを理解している必要がある

なぜXMLを使うのか

XMLを通信に使う理由はいくつかあります。

主なメリット:

  • 人間が読める:テキスト形式なのでデバッグしやすい
  • 構造化データ:階層構造を表現できる
  • 拡張性が高い:新しい要素を追加しやすい
  • 標準化されている:多くのツールやライブラリがある
  • プラットフォーム非依存:どんな環境でも扱える

ただし、最近ではJSONも人気が出てきています。

主要なXML通信プロトコル

XMLを使った代表的な通信プロトコルを見ていきましょう。

1. SOAP(Simple Object Access Protocol)

SOAPは、最も有名なXMLベースの通信プロトコルです。

特徴:

  • W3C標準のプロトコル
  • 厳密な仕様とルール
  • エンタープライズ向け
  • セキュリティ機能が充実
  • 主にHTTP/HTTPSで通信

読み方:

  • 「ソープ」と読みます

2. XML-RPC(XML Remote Procedure Call)

XML-RPCは、シンプルなリモート手続き呼び出しのプロトコルです。

特徴:

  • SOAPより軽量でシンプル
  • 学習コストが低い
  • 古くから存在(1998年登場)
  • 基本的な機能に特化

3. REST with XML

REST(Representational State Transfer)でXMLを使う方法です。

特徴:

  • RESTの原則に従う
  • HTTPメソッド(GET、POST、PUT、DELETE)を活用
  • シンプルで分かりやすい
  • JSONも使えるが、XMLも選択肢の一つ

4. WebDAV

WebDAV(Web Distributed Authoring and Versioning)は、ファイル管理のプロトコルです。

特徴:

  • HTTPの拡張
  • ファイルの読み書き、管理
  • XMLで情報をやり取り

これらのプロトコルは、それぞれ異なる用途に適しています。

SOAP(Simple Object Access Protocol)詳細

SOAPについて詳しく見ていきましょう。

SOAPの基本構造

SOAPメッセージは、Envelope(封筒)という構造で包まれています。

基本的な構成:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
        <!-- ヘッダー情報(オプション) -->
    </soap:Header>
    <soap:Body>
        <!-- 実際のデータ -->
    </soap:Body>
</soap:Envelope>

各部分の役割:

  • Envelope:メッセージ全体を包む
  • Header:認証情報などのメタデータ(省略可能)
  • Body:実際に送りたいデータ

SOAPリクエストの例

サーバーに「気温を教えて」とお願いする例です。

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:web="http://example.com/weather">
    <soap:Header/>
    <soap:Body>
        <web:GetTemperature>
            <web:City>Tokyo</web:City>
            <web:Date>2024-11-14</web:Date>
        </web:GetTemperature>
    </soap:Body>
</soap:Envelope>

説明:

  • GetTemperature:呼び出したいメソッド名
  • CityDate:メソッドのパラメータ

SOAPレスポンスの例

サーバーからの返事です。

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:web="http://example.com/weather">
    <soap:Header/>
    <soap:Body>
        <web:GetTemperatureResponse>
            <web:Temperature>15.5</web:Temperature>
            <web:Unit>Celsius</web:Unit>
        </web:GetTemperatureResponse>
    </soap:Body>
</soap:Envelope>

説明:

  • GetTemperatureResponse:レスポンスであることを示す
  • Temperature:気温の値
  • Unit:単位

SOAPエラーの表現

エラーが発生した場合は、Fault要素で表現します。

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Client</faultcode>
            <faultstring>Invalid city name</faultstring>
            <detail>
                <error>The city 'Tokyoo' was not found</error>
            </detail>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

エラー情報:

  • faultcode:エラーの種類
  • faultstring:エラーメッセージ
  • detail:詳細情報

WSDL(Web Services Description Language)

SOAPと一緒に使われるのがWSDLです。

WSDLとは:

  • Webサービスの「取扱説明書」
  • どんなメソッドがあるか
  • どんなパラメータが必要か
  • どんなレスポンスが返るか

簡単なWSDLの例:

<?xml version="1.0" encoding="UTF-8"?>
<definitions 
    name="WeatherService"
    targetNamespace="http://example.com/weather"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">

    <message name="GetTemperatureRequest">
        <part name="city" type="xsd:string"/>
        <part name="date" type="xsd:date"/>
    </message>

    <message name="GetTemperatureResponse">
        <part name="temperature" type="xsd:float"/>
        <part name="unit" type="xsd:string"/>
    </message>

    <portType name="WeatherPortType">
        <operation name="GetTemperature">
            <input message="GetTemperatureRequest"/>
            <output message="GetTemperatureResponse"/>
        </operation>
    </portType>

    <!-- 省略 -->
</definitions>

WSDLがあれば、クライアントは自動的に通信コードを生成できます。

XML-RPC詳細

XML-RPCについて見ていきましょう。

XML-RPCの基本構造

SOAPよりシンプルです。

リクエストの形式:

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
    <methodName>メソッド名</methodName>
    <params>
        <param>
            <value>パラメータ1</value>
        </param>
        <param>
            <value>パラメータ2</value>
        </param>
    </params>
</methodCall>

XML-RPCリクエストの例

数値を足し算するメソッドを呼び出す例です。

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
    <methodName>math.add</methodName>
    <params>
        <param>
            <value><int>5</int></value>
        </param>
        <param>
            <value><int>3</int></value>
        </param>
    </params>
</methodCall>

説明:

  • methodNamemath.addというメソッドを呼び出す
  • 2つのパラメータ:5と3

XML-RPCレスポンスの例

サーバーからの返事です。

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
    <params>
        <param>
            <value><int>8</int></value>
        </param>
    </params>
</methodResponse>

説明:

  • 計算結果の8が返ってくる

XML-RPCのデータ型

XML-RPCでサポートされているデータ型です。

基本的なデータ型:

<!-- 整数 -->
<value><int>42</int></value>
<value><i4>42</i4></value>

<!-- 小数 -->
<value><double>3.14</double></value>

<!-- 文字列 -->
<value><string>Hello</string></value>
<value>Hello</value>  <!-- stringタグは省略可 -->

<!-- 真偽値 -->
<value><boolean>1</boolean></value>  <!-- true -->
<value><boolean>0</boolean></value>  <!-- false -->

<!-- 日時 -->
<value><dateTime.iso8601>20241114T12:00:00</dateTime.iso8601></value>

<!-- Base64エンコードされたバイナリ -->
<value><base64>SGVsbG8gV29ybGQ=</base64></value>

構造化データ:

<!-- 配列 -->
<value>
    <array>
        <data>
            <value><int>1</int></value>
            <value><int>2</int></value>
            <value><int>3</int></value>
        </data>
    </array>
</value>

<!-- 構造体(連想配列) -->
<value>
    <struct>
        <member>
            <name>name</name>
            <value><string>山田太郎</string></value>
        </member>
        <member>
            <name>age</name>
            <value><int>30</int></value>
        </member>
    </struct>
</value>

REST with XML

RESTアーキテクチャでXMLを使う方法です。

RESTの基本原則

RESTは、アーキテクチャスタイルの一つです。

主な原則:

  • リソース指向(URLでリソースを表現)
  • HTTPメソッドを適切に使用
  • ステートレス(状態を保持しない)
  • キャッシュ可能

RESTでのHTTPメソッドの使い分け

標準的な使い方:

  • GET:データの取得
  • POST:データの作成
  • PUT:データの更新(置き換え)
  • PATCH:データの部分更新
  • DELETE:データの削除

REST with XMLの例

ユーザー情報を扱うAPIの例です。

ユーザー一覧の取得(GET):

リクエスト:
GET /api/users HTTP/1.1
Host: example.com
Accept: application/xml

レスポンス:
HTTP/1.1 200 OK
Content-Type: application/xml

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user id="1">
        <name>山田太郎</name>
        <email>yamada@example.com</email>
    </user>
    <user id="2">
        <name>佐藤花子</name>
        <email>sato@example.com</email>
    </user>
</users>

特定ユーザーの取得(GET):

リクエスト:
GET /api/users/1 HTTP/1.1
Host: example.com
Accept: application/xml

レスポンス:
HTTP/1.1 200 OK
Content-Type: application/xml

<?xml version="1.0" encoding="UTF-8"?>
<user id="1">
    <name>山田太郎</name>
    <email>yamada@example.com</email>
    <created_at>2024-01-15T10:30:00Z</created_at>
</user>

新規ユーザーの作成(POST):

リクエスト:
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/xml

<?xml version="1.0" encoding="UTF-8"?>
<user>
    <name>鈴木一郎</name>
    <email>suzuki@example.com</email>
</user>

レスポンス:
HTTP/1.1 201 Created
Content-Type: application/xml
Location: /api/users/3

<?xml version="1.0" encoding="UTF-8"?>
<user id="3">
    <name>鈴木一郎</name>
    <email>suzuki@example.com</email>
    <created_at>2024-11-14T12:00:00Z</created_at>
</user>

ユーザー情報の更新(PUT):

リクエスト:
PUT /api/users/1 HTTP/1.1
Host: example.com
Content-Type: application/xml

<?xml version="1.0" encoding="UTF-8"?>
<user>
    <name>山田太郎</name>
    <email>new.yamada@example.com</email>
</user>

レスポンス:
HTTP/1.1 200 OK
Content-Type: application/xml

<?xml version="1.0" encoding="UTF-8"?>
<user id="1">
    <name>山田太郎</name>
    <email>new.yamada@example.com</email>
    <updated_at>2024-11-14T12:05:00Z</updated_at>
</user>

ユーザーの削除(DELETE):

リクエスト:
DELETE /api/users/1 HTTP/1.1
Host: example.com

レスポンス:
HTTP/1.1 204 No Content

RESTのエラー表現

HTTPステータスコードとXMLでエラーを表現します。

HTTP/1.1 404 Not Found
Content-Type: application/xml

<?xml version="1.0" encoding="UTF-8"?>
<error>
    <code>404</code>
    <message>User not found</message>
    <detail>The user with ID 999 does not exist</detail>
</error>

プログラミング言語での実装例

各言語での実装方法を見ていきましょう。

Python(SOAPクライアント)

zeepライブラリを使用:

from zeep import Client

# WSDLのURL
wsdl_url = 'http://example.com/weather?wsdl'

# クライアントを作成
client = Client(wsdl=wsdl_url)

# メソッドを呼び出し
result = client.service.GetTemperature(
    City='Tokyo',
    Date='2024-11-14'
)

print(f'気温: {result.Temperature}度')

Python(XML-RPCクライアント)

標準ライブラリを使用:

import xmlrpc.client

# サーバーに接続
server = xmlrpc.client.ServerProxy('http://example.com/xmlrpc')

# メソッドを呼び出し
result = server.math.add(5, 3)
print(f'結果: {result}')  # 8

Python(REST with XML)

requestsライブラリを使用:

import requests
import xml.etree.ElementTree as ET

# GETリクエスト
response = requests.get(
    'http://example.com/api/users/1',
    headers={'Accept': 'application/xml'}
)

# XMLをパース
root = ET.fromstring(response.content)
name = root.find('name').text
print(f'名前: {name}')

# POSTリクエスト
xml_data = '''
<?xml version="1.0" encoding="UTF-8"?>
<user>
    <name>鈴木一郎</name>
    <email>suzuki@example.com</email>
</user>
'''

response = requests.post(
    'http://example.com/api/users',
    data=xml_data,
    headers={'Content-Type': 'application/xml'}
)

print(f'ステータスコード: {response.status_code}')

JavaScript(SOAPクライアント)

soapライブラリを使用:

const soap = require('soap');

const url = 'http://example.com/weather?wsdl';

soap.createClient(url, function(err, client) {
    if (err) {
        console.error(err);
        return;
    }

    // メソッドを呼び出し
    client.GetTemperature({
        City: 'Tokyo',
        Date: '2024-11-14'
    }, function(err, result) {
        if (err) {
            console.error(err);
            return;
        }

        console.log('気温:', result.Temperature + '度');
    });
});

PHP(SOAPクライアント)

標準のSoapClientを使用:

<?php
// WSDLのURL
$wsdl = 'http://example.com/weather?wsdl';

// SOAPクライアントを作成
$client = new SoapClient($wsdl);

// メソッドを呼び出し
$result = $client->GetTemperature([
    'City' => 'Tokyo',
    'Date' => '2024-11-14'
]);

echo '気温: ' . $result->Temperature . '度';
?>

Java(REST with XML)

HttpClientとJAXBを使用:

import java.net.http.*;
import java.net.URI;

public class RestClient {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();

        // GETリクエスト
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("http://example.com/api/users/1"))
            .header("Accept", "application/xml")
            .GET()
            .build();

        HttpResponse<String> response = client.send(
            request,
            HttpResponse.BodyHandlers.ofString()
        );

        System.out.println("レスポンス: " + response.body());
    }
}

各プロトコルの比較と使い分け

どのプロトコルを選ぶべきか、比較してみましょう。

比較表

項目SOAPXML-RPCREST with XML
複雑さ高い低い中程度
学習コスト高い低い中程度
セキュリティWS-Securityで充実基本的HTTPSで対応
パフォーマンスやや遅い普通速い
拡張性非常に高い限定的高い
ツールサポート豊富少ない豊富
主な用途エンタープライズ簡易RPCWeb API

SOAPを選ぶべき場合

適している状況:

  • 金融システムなど、セキュリティが重要
  • トランザクション管理が必要
  • 複雑なビジネスロジック
  • WS-*標準(WS-Security、WS-ReliableMessagingなど)が必要
  • エンタープライズ環境

例:

  • 銀行の決済システム
  • 企業間のデータ交換
  • レガシーシステムとの統合

XML-RPCを選ぶべき場合

適している状況:

  • シンプルなリモート手続き呼び出し
  • 小規模なシステム
  • 学習コストを抑えたい
  • 古いシステムとの互換性

例:

  • ブログのトラックバック
  • 簡易的な管理ツール
  • プロトタイピング

REST with XMLを選ぶべき場合

適している状況:

  • Web API
  • リソース指向の設計
  • シンプルで分かりやすいインターフェース
  • パフォーマンスを重視
  • JSONとXMLの両方をサポートしたい

例:

  • モバイルアプリのバックエンド
  • Webサービスの公開API
  • マイクロサービス間の通信

セキュリティの考慮事項

XML通信のセキュリティについて見ていきましょう。

基本的なセキュリティ対策

必須の対策:

  1. HTTPSの使用
  • 通信の暗号化
  • 盗聴の防止
  1. 認証・認可
  • APIキー
  • OAuth 2.0
  • JWT(JSON Web Token)
  1. 入力検証
  • XMLインジェクション対策
  • パラメータのバリデーション

XML固有のセキュリティリスク

XXE(XML External Entity)攻撃:

<!-- 悪意のあるXML -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>

対策:

  • 外部エンティティの無効化
  • DTDの処理を無効化

Python での対策例:

import xml.etree.ElementTree as ET

# 安全でない方法
# root = ET.fromstring(xml_data)

# 安全な方法
import defusedxml.ElementTree as DET
root = DET.fromstring(xml_data)

SOAP WS-Security

SOAPでは、WS-Securityという標準があります。

提供される機能:

  • メッセージの署名
  • メッセージの暗号化
  • タイムスタンプ
  • ユーザー名トークン

例:

<soap:Header>
    <wsse:Security>
        <wsse:UsernameToken>
            <wsse:Username>user</wsse:Username>
            <wsse:Password Type="...">password</wsse:Password>
        </wsse:UsernameToken>
    </wsse:Security>
</soap:Header>

JSONとの比較

最近はJSONも人気です。XMLとの違いを見てみましょう。

XMLの利点

XMLが優れている点:

  • 属性とコメントが使える
  • 名前空間で衝突を回避
  • スキーマ検証が強力(XSD)
  • 複雑な文書構造に適している
  • XSLTで変換が可能

XMLの例:

<book isbn="978-4-1234-5678-9" language="ja">
    <!-- 日本語の本 -->
    <title>XMLの教科書</title>
    <author>山田太郎</author>
    <price currency="JPY">2800</price>
</book>

JSONの利点

JSONが優れている点:

  • よりシンプルで軽量
  • JavaScriptとの親和性が高い
  • 人間が読みやすい
  • パースが高速

JSONの例:

{
  "book": {
    "isbn": "978-4-1234-5678-9",
    "language": "ja",
    "title": "XMLの教科書",
    "author": "山田太郎",
    "price": {
      "amount": 2800,
      "currency": "JPY"
    }
  }
}

使い分けの目安

XMLを選ぶべき:

  • レガシーシステムとの統合
  • 複雑な文書構造
  • 厳密なバリデーションが必要
  • 企業間のデータ交換

JSONを選ぶべき:

  • Webアプリケーション
  • モバイルアプリ
  • シンプルなデータ構造
  • パフォーマンス重視

よくある質問と回答

Q1. SOAPとRESTはどちらが良い?

A. 用途によります。エンタープライズシステムで厳密な仕様が必要ならSOAP、Web APIで柔軟性とシンプルさを求めるならRESTが適しています。最近のトレンドはRESTですが、SOAPが必要な場面もまだまだあります。

Q2. XMLは古い技術?

A. 古くからある技術ですが、今でも多くの場面で使われています。特に企業システムやWebサービスの世界では現役です。ただし、新規プロジェクトではJSONを選択することも多くなっています。

Q3. WSDLは必須?

A. SOAPを使う場合、WSDLがあると便利ですが必須ではありません。ただし、WSDLがあるとクライアントコードの自動生成ができるため、開発効率が上がります。

Q4. HTTPSは必須?

A. セキュリティの観点から、本番環境では必ずHTTPSを使用すべきです。特に認証情報や個人情報を扱う場合は必須です。

Q5. XML-RPCは今でも使われている?

A. 使用率は減っていますが、一部のシステムやツールでは今でも使われています。新規プロジェクトではSOAPかRESTを選択することが多いです。

Q6. SOAPは遅いって本当?

A. RESTやJSON-RPCと比べると、オーバーヘッドがあるため若干遅くなる傾向があります。ただし、適切に設計すれば実用上問題ないレベルです。

まとめ

XMLを使った通信プロトコルについてまとめます。

主要なプロトコル:

  • SOAP:エンタープライズ向け、セキュリティ充実、複雑
  • XML-RPC:シンプルなRPC、学習コスト低い、機能は基本的
  • REST with XML:リソース指向、HTTPメソッド活用、柔軟

選択の目安:

  • エンタープライズシステム → SOAP
  • シンプルなRPC → XML-RPC
  • Web API → REST(XMLまたはJSON)

セキュリティ:

  • 必ずHTTPSを使用
  • 入力検証を徹底
  • XXE攻撃に注意
  • 認証・認可の実装

現代のトレンド:

  • RESTが主流
  • JSONも人気
  • SOAPは特定用途で使用
  • GraphQLなど新しい選択肢も

XMLベースの通信プロトコルは、それぞれ特徴があります。プロジェクトの要件に応じて、適切なプロトコルを選択することが大切です。

この記事が、あなたのシステム開発の役に立てば嬉しいです。適切な技術選択で、より良いシステムを作っていきましょう!

コメント

タイトルとURLをコピーしました