SOAP

SOAPとは、Webサービス間でメッセージを交換するためのプロトコルであり、W3Cによって仕様が策定されている。Webサービス同士でドキュメントの交換を行ったり、Remote Procedure Call (RPC)を行ったりするために利用される。Webサービスとは、Web経由でアクセスすることができるサービス(プログラム)であり、Webサイトに限られるわけではない。

概要

SOAPは「SOAPメッセージ」と呼ばれるXML形式のメッセージ構造の仕様のみ規定しており、SOAPメッセージを運ぶ下位のプロトコル(トランスポートプロトコル)に関しては規定が無い。SOAPの下位プロトコルとしてSMTPやFTPなどさまざまなプロトコルを利用できるが、一般的にはHTTPを利用する。

SOAPメッセージの例を以下に示す。

Post /url HTTP/1.1
Host: itref.fc2web.com
Content-Type: application/soap+xml; charset="utf-8";
Content-Length: 350

<?xml version="1.1"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Body>
    <foo:bar xmlns:foo="http://itref.fc2web.com/foo">
      <foo:baz>sample</foo:baz>
    </foo:bar>
  </env:Body>
</env:Envelope>

Envelope

EnvelopeはSOAPメッセージのルート要素である。

次の要素を子要素として含むことができる。

Envelopeの子要素
要素 必須/任意
Header 任意
Body 必須

Envelope要素には次の属性を指定する。

xmlns
SOAPの名前空間「http://schemas.xmlsoap.org/soap/envelope/」を指定する。

接頭辞(prefix)も指定できる。任意の接頭辞を付けることができるが、慣習的に「env」とすることが多い。

<?xml version="1.1"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Header>
    <!-- content -->
  </env:Header>
  <env:Body>
    <!-- content -->
  </env:Body>
</env:Envelope>
親要素Envelope
子要素ヘッダブロックNotUnderstood

ヘッダブロック

親要素Header

ヘッダブロックには次の属性を指定できる。

encodingStyle
xs:anyURI
mustUnderstand
xs:boolean
relay
xs:boolean
role
xs:anyURI

Body

親要素Envelope

Fault

親要素Body
子要素Code(必須)、Reason(必須)、Detail(任意)、Role(任意)、Node(任意)
<env:Fault>
  <env:Code>
    <env:Value>Receiver</env:Value>
  </env:Code>
  <env:Reason>
    <env:Text xml:lang="ja">
      <!-- content -->
    </env:Text>
  <env:Reason>
</env:Fault>

Code

親要素Fault
子要素Value(必須)、Subcode(任意)
<env:Code>
  <env:Value>Receiver</env:Value>
</env:Code>

Value

親要素CodeSubcode
内容SOAPフォルトコード
SOAPフォルトコード
SOAPフォルトコード説明
VersionMismatchエンベロープの名前空間の不一致
MustUnderstand mustUnderstand属性の付いたHeader要素が処理不能
DataEncodingUnknownencodingStyle属性の円コーディング未対応
Sender送られてきたメッセージの構成不正
Receiverサーバ側のエラー
<env:Value>Receiver</env:Value>

Subcode

親要素CodeSubcode
子要素Value(必須)、SubCode(任意)

Reason

親要素Fault
子要素Text
<env:Reason>
  <env:Text xml:lang="ja">
    <!-- content -->
  </env:Text>
<env:Reason>

Detail

親要素Fault

Text

親要素Reason
属性xml:lang
<?xml version="1.1"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Header>
    <env:NotUnderstood qname="foo:Example" xmlns:foo="https://segakuin.com/foo" />
  </env:Header>
  <env:Body>
    <env:Fault>
      <env:Code>
        <env:Value>env:MustUnderstand</env:Value>
      <env:/Code>
      <env:Reason>
        <env:Text xml:lang='en'>
          One or more mandatory SOAP header blocks not understood
        <env:Text>
      <env:/Reason>
    <env:/Fault>
  </env:Body>
</env:Envelope>

Node

親要素Fault

Role

親要素Fault

NotUnderstood

SOAPノードがコードの値を「env:MustUnderstand」に設定してフォルトを生成する場合、生成されたフォルトメッセージにNotUndersted SOAPヘッダーブロックを提供する必要がある。

NotUndersted SOAPヘッダー・ブロックには、理解されなかった特定のSOAPヘッダー・ブロックのXML修飾名の詳細が記述されている。

親要素Header
属性qname、xmlns
<?xml version="1.1"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Header>
    <env:NotUnderstood qname="foo:Example" xmlns:foo="https://segakuin.com/foo" />
  </env:Header>
  <env:Body>
    <env:Fault>
      <env:Code>
        <env:Value>env:MustUnderstand</env:Value>
      <env:/Code>
      <env:Reason>
        <env:Text xml:lang='en'>
          One or more mandatory SOAP header blocks not understood
        <env:Text>
      <env:/Reason>
    <env:/Fault>
  </env:Body>
</env:Envelope>

属性

encodingStyle属性

要素ヘッダブロック、Bodyの子要素
xs:anyURI