SOAP インターフェイス

要約:
Curl® 言語は、SOAP 1.1 を使用して HTTP 上の Web サービス リクエストをサポートします。次の機能が含まれています。
  • XML スキーマの基本的なタイプから Curl 言語タイプへの自動マッピング
  • SOAP リモート プロシージャコール (RPC) に対応する Curl 言語記述子の作成
  • XML 型のユーザー独自のマーシャリング/アンマーシャリングを容易に定義し、それらのマッピングを登録
  • SOAP のエラーを Curl 言語の例外にマッピング
注意: Curl® WSDL には、さらに詳しいフル機能の SOAP 実装が含まれています。 これには、大半の SOAP データ型、リファレンスのサポート、 非同期 SOAP の呼び出し、および WSDL ファイルからの自動コード生成が含まれます。 Curl WSDK の詳細に関しては、「Curl Web サイト」 を参照してください。

イントロダクション

SOAP (Simple Object Access Protocol) インターフェイスを使用して、Curl 言語で書かれたアプレットに Web サービスへのアクセスを容易に追加できます。SOAP は CURL.XML.SOAP パッケージに格納されています。たとえば、ご使用のアプレットが株価の統計分析を行うと想定します。分析アルゴリズムはクライアント マシン上でローカルに実行されますが、分析に必要な最新のデータを取得するには定期的に Web サイトに行くことが必要です。このため、Web サービスの情報リクエストを発信して返ってくるデータを処理するコードをアプレットに追加します。
SOAP は、分散環境における情報交換を実行する XML ベースのプロトコルです。Curl 言語で書かれたアプレットに SOAP リモート プロシージャコール (RPC) を追加します。ここで、Soap-1-1-HttpOperation クラスを使用してオペレーションを指定し、Soap-1-1-StandardArgumentDescriptor クラスを使用して入力 / 出力引数を定義します。
多数の XML スキーマ組み込みデータ型が Curl 言語型に自動的に変換されて、HTTP 上の SOAP がサポートされます。また、Curl 言語型と他の XML 型の変換に必要なマーシャラーとアンマーシャラーの作成、登録もサポートしています。

アプレットから SOAP サービスを呼び出す方法

A. Curl 言語を使用して HTTP 上で SOAP サービスを呼び出すには、次の手順に従ってください。
  1. SOAP サービスのインターフェイスに関する必要な情報を集めます。これには URL、SOAPAction HTTP ヘッダーの値、オペレーション名、入力 / 出力引数の名前と種類が含まれます。これらの情報は、Web Service Description Language (WSDL) ファイルから、または他のフォームで入手可能です。
  2. 引数の型が XML 型なので、これを Curl 言語型にマップする必要があります。実行時に XML 型と Curl 言語型間のマッピングがある程度実行されますが、ユーザー独自のマッピングを提供する方法もあります。実行時に提供されたマッピングに入力 / 出力引数のすべてのデータ型が含まれている場合は、ユーザー独自のマッピングを提供する必要はありません。ユーザー独自のマッピングを作成する必要がある場合は、下記のパート B を参照してください。
  3. 手順 1 と 2 で収集した情報に基づいて、 Soap-1-1-HttpOperation のインスタンスと Soap-1-1-StandardArgumentDescriptor のインスタンスを初期化します。入力と出力の各引数について Soap-1-1-StandardArgumentDescriptor のインスタンスを 1 つ作成します。
  4. 前の手順で初期化した Soap-1-1-HttpOperation のインスタンス上で call メソッドを使用して、SOAP サービスを呼び出します。
B. 上記の手順 2 で述べたように、自動的にマップされない引数型がある場合は、ユーザー独自のマッピングを提供する必要があります。その場合は XML 型と Curl 言語型間の各マッピングについて次を実行します。
  1. XML 型へまたは XML 型からのマップを行う既存の Curl 言語型を識別するか、新規の Curl 言語型を作成します。既存の Curl 言語型の詳細については、「データ型」を参照してください。
  2. マッピングのマーシャラーまたはアンマーシャラーを書きます。入力引数については、Curl 言語型の値を XML 型の値に変換するマーシャラーを提供する必要があります。出力引数については、XML 型の値をCurl 言語型の値に変換するアンマーシャラーが必要です。
    さらに、ユーザー提供のマッピングが必要な SOAP サービスを呼び出す前に、次の実行が必要です。
  3. XMLCurlMappingRegistry のインスタンスを作成します。
  4. 各マッピングについて XMLCurlMappingRegistry のインスタンス上で map-types メソッドを呼び出します。
  5. Soap-1-1-HttpOperation.call メソッドで registry キーワード引数の値として、XMLCurlMappingRegistry のインスタンスをインクルードします。
これらの手順について、次に詳しく説明します。
注意: SOAP インターフェイスを使用するには、次のステートメントをインクルードして CURL.XML.SOAP パッケージをアプレットにインポートします。
{import * from CURL.XML.SOAP}
このパッケージ内のクラスを使用するすべてのアプレットにこのステートメントをインクルードします。

WSDL の SOAP 呼び出し情報の取得

天気の Web サービスへのインターフェイスを記述している次の WSDL を参照してください (Web サービス記述言語である WSDL の詳細は www.w3.org/TR/wsdl を参照)。 このサービスは、郵便番号を入力値としてその地域の気温を返します。

WSDL ファイルの例

この Web サービスを設定する WSDL ファイルの例は次のようになります。
<definitions name="TemperatureService" 
targetNamespace="http://www.xmethods.net/sd/TemperatureService.wsdl">
  <message name="getTempRequest">
    <part name="zipcode" type="xsd:string"/>
  </message>
  <message name="getTempResponse">
    <part name="return" type="xsd:float"/>
  </message>
  <portType name="TemperaturePortType">
    <operation name="getTemp">
      <input message="tns:getTempRequest"/>
      <output message="tns:getTempResponse"/>
    </operation>
  </portType>
  <binding name="TemperatureBinding" type="tns:TemperaturePortType">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="getTemp">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="encoded" namespace="urn:xmethods-Temperature-Demo" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
        <soap:body use="encoded" namespace="urn:xmethods-Temperature-Demo" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
    </operation>
  </binding>
  <service name="TemperatureService">
    <documentation>
      Returns current temperature in a given U.S. zipcode  
    </documentation>
    <port name="TemperaturePort" binding="tns:TemperatureBinding">
      <soap:address location="http://services.xmethods.net:80/soap/servlet/rpcrouter"/>
    </port>
  </service>
</definitions>

WSDL の情報を Soap-1-1-HttpOperation にトランスレート

WSDL に格納されているさまざまな情報や、同様の Web サービス記述を検索する際には主に、オペレーション名、いずれかの入力 / 出力引数の情報を識別します。要素は <element> <\element> で区切られてネストされているため、要素の内部でさらに他の要素を検索することが必要です。
Soap-1-1-HttpOperation の既定のコンストラクタは次の引数を含みます。次のセクションでは、Web サービス記述から値を抽出する方法について説明します。

Soap-1-1-HttpOperation コンストラクタ内の operation 引数

binding 要素内には operation 要素が格納されています。operation 要素は name 属性を持ちます。operation 要素内には body 要素が格納されています。body 要素の名前空間は "http://schemas.xmlsoap.org/wsdl/soap/" です。body 要素は namespace 属性を持ちます。Soap-1-1-HttpOperation 内の operation 引数は XMLName です。この名前空間は body 要素の namespace 属性の値で、このローカル名は operation 要素の name 属性の値です。
上記の WSDL ファイルでは、body 要素の namespace 属性の値は "urn:xmethods-Temperature" で、operation 要素の name 属性の値は "getTemp" です。したがって、Soap-1-1-HttpOperation 内の operation 引数の値は {new XMLName, "urn:xmethods-Temperature", "getTemp"} となります。

Soap-1-1-HttpOperation コンストラクタ内の address 引数

上記に記載された binding 要素に対応する port 要素を識別します。port 要素は service 要素内に格納されています。port 要素内に格納されている address 要素を識別します。address 要素の名前空間は "http://schemas.xmlsoap.org/wsdl/soap/" です。Soap-1-1-HttpOperation コンストラクタ内の address 引数は、address 要素内の location 属性の値です。
上記の WSDL ファイルでは、address 要素内の location 属性の値は "http://services.xmethods.net:80/soap/servlet/rpcrouter" です。これは、Soap-1-1-HttpOperation コンストラクタ内の address 引数の値です。

Soap-1-1-HttpOperation コンストラクタ内の soap-action 引数

operation 要素内に格納されている name 属性は operation 要素です。この operation 要素は名前空間 "http://schemas.xmlsoap.org/wsdl/soap/" を持ちます。Soap-1-1-HttpOperation コンストラクタ内の soap-action 引数は、operation 要素内の soapAction 属性の値です。
上記の WSDL ファイルでは、operation 要素の soapAction 属性の値は "" (空白の文字列) です。したがって、Soap-1-1-HttpOperation 内の soap-action 引数の値は "" となります。

Soap-1-1-HttpOperation コンストラクタ内の input-argumentsoutput-arguments 引数

WSDL ファイルから取得した入力 / 出力引数情報の解釈は、その WSDL ファイルの作成方法と引数の複雑さに応じて、シンプルな場合も複雑な場合もあります。ここでは、上記の WSDL の例に合わせたシンプルなケースを説明します。
上記の例でオペレーション名を検出した operation 要素を識別します。これは type 属性を持つ binding 要素内に格納されています。 type 属性の値は portType 要素を参照します。portType 要素の name 属性の値は、binding 要素の type 属性の値とマッチします。
次に portType 要素内に格納されている、マッチする operation 要素を識別します。operation 要素の近くに input 要素と output 要素があります。input 要素と output 要素は両方とも message 属性を持ちます。各 message 属性の値は message 要素を参照します。message 要素の name 属性の値は、input 要素または output 要素の message 属性の値と同じです。message 要素は、input または output 要素のどちらによって参照されているかに応じて、入力または出力引数を記述します。
part 要素は引数に対応しています。"getTemp" の入力引数に対応するメッセージは "getTempRequest" で、"getTemp" の出力引数に対応するメッセージは "getTempResponse" です。"getTempRequest" メッセージには 1 つの part 要素のみ含まれているので、"getTemp" オペレーションは 1 つの入力引数のみ持つことになります。

part 要素から Soap-1-1-StandardArgumentDescriptor を構築する方法

Soap-1-1-StandardArgumentDescriptor の既定のコンストラクタは次の引数を含みます。次の段落で、Web サービス記述から値を抽出する方法について説明します。
Soap-1-1-StandardArgumentDescriptor コンストラクタの name 引数は、part 要素の name 属性の値です。"getTempRequest" 内の part 要素については、name 属性の値は "zipcode" です。"zipcode" は名前空間として使用できないので、Soap-1-1-StandardArgumentDescriptor への name 引数の値は {new XMLName, "", "zipcode"} となります。
Soap-1-1-StandardArgumentDescriptorxml-type 引数は、part 要素の type 属性の値です。"getTempRequest" 内の part 要素については、type 属性の値は "xsd:string" となり、これは名前空間として使用できます。ここで名前空間のプレフィックス "xsd" に対応する名前空間は "http://www.w3.org/2001/XMLSchema" です。したがって、Soap-1-1-StandardArgumentDescriptor コンストラクタの xml-type 引数の値は {new XMLName, "http://www.w3.org/2001/XMLSchema", "string"} となります。
ここでは "string" に実行時提供のマッピングを使用するので (「提供されているデータ型マッピング」を参照)、Soap-1-1-StandardArgumentDescriptor への curl-type 引数の値は String となります。
encoding-style 引数には既定値を使用します。この場合、異なる値を指定する必要はありません。

集約

さまざまな部分が作成できたので、ここで Soap-1-1-HttpOperationSoap-1-1-StandardArgumentDescriptor クラスのインスタンス化を実行し、すべてのオペレーション コンポーネントを Curl アプレット内に集約します。上記の WSDL ファイルで宣言されたオペレーションに対応する Curl 言語の署名は次のようになります。
{define-proc {getTemp zipcode:String}:float}
プロシージャ getTemp は、次の記述子入力 / 出力引数およびリクエストされた SOAP オペレーションを作成して定義します。次に、Curl 言語で定義された上記の引数の記述子と SOAP オペレーションを示します。
{import * from CURL.XML.SOAP}
{let xsd:String = "http://www.w3.org/2001/XMLSchema"}
{let xsi:String = "http://www.w3.org/2001/XMLSchema-instance"}

|| One input argument named "zipcode" of type "string"
|| corresponding to Curl language type String.
{let input-arguments:{Array-of Soap-1-1-ArgumentDescriptor} =
    {{Array-of Soap-1-1-ArgumentDescriptor}
        {Soap-1-1-StandardArgumentDescriptor
            {XMLName "", "zipcode"},
            {XMLName xsd, "string"},
            String
        }
    }
}

|| One output argument named "return" of XML type float
|| corresponding to Curl language type float.
{let output-arguments:{Array-of Soap-1-1-ArgumentDescriptor} =
    {{Array-of Soap-1-1-ArgumentDescriptor}
        {Soap-1-1-StandardArgumentDescriptor
            {XMLName "", "return"},
            {XMLName xsd, "float"},
            float
        }
    }
}

|| The operation descriptor.
{let get-temp:Soap-1-1-HttpOperation =
    {Soap-1-1-HttpOperation
        || operation name
        {XMLName "urn:xmethods-Temperature-Demo", "getTemp"},
        || url
        {url "http://services.xmethods.net:80/soap/servlet/rpcrouter" },
        || SOAPAction value in HTTP headers
        "",
        input-arguments,
        output-arguments,
        include-type-attribute? = true, || ###
        xsi = xsi || ### 
    }
}

{let result = {get-temp.call trace?= true, "02142"}}
{value result[0]}

SOAP リモート プロシージャコール

SOAP オペレーションを定義してその入力 / 出力引数を指定したら、次の SOAP RPC をCurl アプレットに追加してサービスをリクエストできます。
|| The actual SOAP call.
{let anys:{Array-of any}={get-temp.call "01915"}}
SOAP RPC の出力引数は Array-of any 内に返されます。この例では、SOAP RPC は float 型の単一の出力引数を返します。したがって anys[0] に結果が格納され、float 部分に気温が示されます。
上記の SOAP 呼び出しに対応する XML の SOAP メッセージのヘッダーと本体部分は、「SOAP 呼び出しのデバッグ」に記載されています。

提供されているデータ型マッピング

SOAP 呼び出しの引数を定義する際、一般的な XML 組み込みデータ型のほとんどは、対応する Curl 言語データ型に変換、または Curl 言語データ型から変換されます。その他の XML 型は手動でマーシャル、アンマーシャルする必要があります。詳細については、「独自のマーシャラー / アンマーシャラーの作成」を参照してください。
次の表に、提供されている XML のプリミティブ / 派生データ型と Curl 言語データ型間のマッピングを示します。
XML 型Curl 言語型
stringString
booleanbool
floatfloat
doubledouble
base64BinaryByteVec
longint64
intint32
shortint16
byteint8
unsignedShortuint16
unsignedByteuint8
また、Curl 言語の SOAP サポートは配列引数のマッピングを処理します。詳細については『API リファレンス マニュアル』の Soap-1-1-ArrayArgumentDescriptor の項目を参照してください。

独自のマーシャラー / アンマーシャラーの作成

Curl 言語型との変換が提供されていない XML 型 (例:struct) については、ユーザー独自のマーシャラーとアンマーシャラー (シリアライザとデシリアライザとも呼びます) を書く必要があります。次のセクションでその方法を説明します。

マーシャリングの例

次の例では、"calculateExchangeRate" という名前の SOAP オペレーションを呼び出します。XML 型 ConvertMessage の入力引数を 1 つ使用します。これは struct で、次の 3 つのフィールド、string、double、string で構成されます。この入力引数には、変換元の通貨の名前、その通貨での金額、変換先の通貨の名前が含まれています。"calculateExchangeRate" オペレーションは XML 型 double の単一の結果を返し、これは 2 番目の通貨の金額に対応しています。
XML 型 ConvertMessage のインスタンスを示します。
<currency>NLG</currency>
<amount>1.00000000000000000E+002</amount>
<toCurrency>DEM</toCurrency>
次に XML 型 ConvertMessage に対応する Curl 言語クラスを示します。ここでは、必要ではありませんが XML 型と同じ名前を Curl 言語クラスに付けていることに留意してください。
{define-class public ConvertMessage
  field public currency:String
  field public amount:double
  field public to-currency:String

  {constructor public {default
                          currency:String,
                          amount:double,
                          to-currency:String
                      }
    set self.currency=currency
    set self.amount=amount
    set self.to-currency=to-currency
  }
}
このコードでは struct のマーシャリングに、struct の 1 つのフィールドをマーシャルするマーシャラー ヘルパーと、全部を統合するマーシャラーを使用しています。
|| marshaler helper -- marshals a field of a struct.
{define-proc public {marshaler-helper
                        mapper:XMLCurlMappingRegistry,
                        encoding-style:String,
                        xos:XMLOutputStream,
                        element-name:XMLName,
                        content-xml-type:XMLName,
                        content-curl-type:Type,
                        content-value:any,
                        include-type-attribute?:bool,
                        xsi:String
                    }:void
    {xos.write-one {new XMLStartElement, element-name}}
    {mapper.marshal
        encoding-style,
        content-value asa content-curl-type,
        content-curl-type,
        content-xml-type,
        xos,
        include-type-attribute?,
        xsi
    }
    {xos.write-one {new XMLEndElement}}
    {return}
}

|| converts Curl language value to XML for ConvertMessage type
{define-proc public {convert-message-marshaler
                        mapper:XMLCurlMappingRegistry,
                        encoding-style:String,
                        value:any,
                        xos:XMLOutputStream,
                        include-type-attribute?:bool,
                        xsi:String
                    }:void

    let cm:ConvertMessage = value asa ConvertMessage
    {marshaler-helper
        mapper,
        encoding-style,
        xos,
        {new XMLName, "", "currency"},
        {new XMLName, "", "string"},
        String,
        cm.currency,
        include-type-attribute?,
        xsi
    }
    {marshaler-helper
        mapper,
        encoding-style,
        xos,
        {new XMLName, "", "amount"},
        {new XMLName, "", "double"},
        double,
        cm.amount,
        include-type-attribute?,
        xsi
    }
    {marshaler-helper
        mapper,
        encoding-style,
        xos,
        {new XMLName, "", "toCurrency"},
        {new XMLName, "", "string"},
        String,
        cm.to-currency,
        include-type-attribute?,
        xsi
    }
    {return}
}

アンマーシャリングの例

次のコードはカスタムのアンマーシャラーの例です。"translate" という名前のオペレーションによって、ホスト名を格納する XML 型 string の入力引数が受理され、そのホスト名で DNS ルックアップが実行されます。IP アドレスとホスト名を含んだ InternetAddress という struct が返されます。struct のフィールドは両方とも XML 型 string です。
XML 型 InternetAddress のインスタンスを示します。
<IP>167.216.248.234</IP>
<Hostname>www.curl.com</Hostname>
次に XML 型 InternetAddress に対応する Curl 言語クラスを示します。ここでは、必要ではありませんが XML 型と同じ名前を Curl 言語クラスに付けていることに留意してください。
{define-class public InternetAddress
  field public ip:String
  field public hostname:String

  {constructor public {default ip:String, hostname:String}
    set self.ip=ip
    set self.hostname=hostname
  }
}
マーシャラーの場合と同様、1 つのフィールドをアンマーシャルするアンマーシャラー ヘルパーと、全体を統合するアンマーシャラーを使用しています。
|| This procedure unmarshals a filed of a struct
{define-proc public {unmarshaler-helper
                        mapper:XMLCurlMappingRegistry,
                        encoding-style:String,
                        input:XMLInputStream,
                        element-name:XMLName,
                        content-xml-type:XMLName,
                        content-curl-type:Type
                    }:any

    let xml-token:XMLToken={input.read-one}
    {if {type-of xml-token} != XMLStartElement then
        {error "expecting XMLStartElement"}
    }
    {if (xml-token asa XMLStartElement).element != element-name then
        {error "element name mismatch"}
    }
    let return-value:any = {mapper.unmarshal
                               encoding-style,
                               content-curl-type,
                               content-xml-type,
                               input
                           }
    set xml-token={input.read-one}
    {if {type-of xml-token} != XMLEndElement then
        {error "expecting XMLEndElement"}
    }
    {return return-value}
}

||Convert XML to Curl language for type InternetAddress
{define-proc public {internet-address-unmarshaler
                        mapper:XMLCurlMappingRegistry,
                        encoding-style:String,
                        input:XMLInputStream
                    }:any

    let ip:any={unmarshaler-helper
                   mapper,
                   encoding-style,
                   input,
                   {new XMLName, "", "IP"},
                   {new XMLName, "", "string"},
                   String
               }
    let hostname:any={unmarshaler-helper
                         mapper,
                         encoding-style,
                         input,
                         {new XMLName, "", "Hostname"},
                         {new XMLName, "", "string"},
                         String
                     }
    {return {new InternetAddress, (ip asa String), (hostname asa
                                                    String)
            }
    }
}

独自のデータ型マッピングの登録

必要なマーシャラーとアンマーシャラーを作成した後、新規のデータ型マッピングを登録します。登録プロセスには、データ型マッピングのレジストリ初期化、マーシャラーまたはアンマーシャラーの登録、registry キーワード引数を Soap-1-1-HttpOperation.call にインクルードの 3 つがあります。上の例でのマーシャラー登録の場合、コードは次のようになります (アンマーシャラーの登録も同様です)。
|| 1. create a type mapping registry
{let my-registry:XMLCurlMappingRegistry={new XMLCurlMappingRegistry}}

|| 2. register the marshaler for ConvertMessage
{my-registry.map-types
    soap-encoding,
    {new XMLName,
        "",
        "ConvertMessage"},
    ConvertMessage,
    convert-message-marshaler,
    null
}

|| 3. the actual SOAP call
{let anys:#{Array-of any}={currency-converter.call
                              {new ConvertMessage, "NLG", 100.0, "DEM"},
                              registry=my-registry
                          }
}

トラブルシューティング

SOAP RPC 使用の際に発生する問題の大部分は、Curl 言語の例外が返されることです。つまり、SOAP フォールトが Curl 言語の例外型として解釈されてしまいます。予想どおりにオペレーションが機能しない場合、次の表を参考にしてエラーに対処してください。
問題理由
Soap-1-1-HttpOperation.callHttpException をスローしました。これは、SOAP メッセージを含む HTTP リクエストからの応答ステータスが OK (200) でなく、応答本体が空白か、または SOAP メッセージを含んでいない場合に発生します。エラーの詳細な情報については、HttpException に含まれている応答ステータスを参照してください。Web サーバーが使用不能か、Soap-1-1-HttpOperation 内 の address フィールドが正しく設定されていない可能性があります。
Soap-1-1-HttpOperation.callSoap-1-1-FaultException をスローしました。これは、SOAP サービスからの応答メッセージに SOAP フォールト要素が含まれている場合に発生します。Soap-1-1-FaultException でフォールトのコードと SOAP フォールト要素のフォールト文字列の部分要素が表示されます。フォールト文字列は、フォールトに関する読み取り可能な説明を示すために表示されます。SOAP 1.1 ではフォールトのコードについて 4 つの可能な値が定義されています。それらは次のとおりです。
  • "VersionMismatch"—SOAP サービスが SOAP エンベロープ要素について無効な名前空間を検出した。これは、サービスが SOAP 1.1 サービスでないことを示している可能性があります。
  • "MustUnderstand"—リクエストに mustUnderstand 属性の SOAP ヘッダー 部分要素が含まれており、SOAP サービスがそれを理解できないか、それに従えない。
  • "Client"—リクエスト内のメッセージが不正確に構成されているか、メッセージに正しい情報が含まれていない。
  • "Server"—メッセージの内容に直接関係した理由ではなく、メッセージの処理に関する問題によってリクエストが処理されなかった。
注意: Soap-1-1-FaultException によりフォールトのコードとフォールトの文字列が表示されますが、残りの SOAP フォールト要素は表示されません。ほとんどの SOAP フォールト要素には detail 部分要素が含まれます。Soap-1-1-HttpOperation.call 上の trace? 引数を true に設定して出力ログに応答を表示し、SOAP フォールトの追加部分要素を検証します。
Soap-1-1-HttpOperation.call で次のフォームのエラーが発生しました。
"エンコーディング encoding-style を使用して、XMLタイプ xml-type の値を、Curlタイプ {type-of value} にマーシャルすることが出来ませんでした。"
このエラーは、Curl 言語型の値を XML 型にマーシャルするためのマッピングが検出されなかったことを示します。実行時に多数のマッピングが提供されていますが、カスタムのマーシャラー(シリアライザ)を作成してユーザー独自のマッピングを登録することができます。このエラーは、ユーザー提供のレジストリ (ユーザー提供のレジストリが registry キーワード引数経由で呼び出される場合)、または実行時提供のレジストリのどちらにもマッピングが検出されなかったことを意味します。このエラーの原因として、Soap-1-1-StandardArgumentDescriptor が正しく指定されていなかった可能性があります。
Soap-1-1-HttpOperation.call で次のフォームのエラーが発生しました。
"エンコーディング encoding-style を使用して、XMLタイプ xml-type の値を、Curlタイプ {type-of value} にマーシャルすることが出来ませんでした。"
このエラーは、XML 型の値を Curl 言語型にアンマーシャルするためのマッピングが検出されなかったことを示します。実行時に多数のマッピングが提供されていますが、カスタムのアンマーシャラー(デシリアライザ)を作成してユーザー独自のマッピングを登録することができます。このエラーは、ユーザー提供のレジストリ (ユーザー提供のレジストリが registry キーワード引数経由で呼び出される場合)、または実行時提供のレジストリのどちらにもマッピングが検出されなかったことを意味します。このエラーの原因として、Soap-1-1-StandardArgumentDescriptor が正しく指定されていなかった可能性があります。
Soap-1-1-HttpOperation.call 中にマーシャリングまたはアンマーシャリングで変換エラーが発生しました。原因としては、次が考えられます。これは、呼び出しに提供された入力引数の型が不正であるか、Soap-1-1-StandardArgumentDescriptor が正しく指定されていない、またはユーザー提供のマーシャラーまたはアンマーシャラーにエラーがある場合です。
Soap-1-1-HttpOperation.call でリターンメッセージ解析中にエラーが発生しました。可能性のある 1 つの原因として、ユーザー提供のマーシャラーまたはアンマーシャラーのエラーがあります。

SOAP 呼び出しのデバッグ

Soap-1-1-HttpOperation.call 上の trace? キーワード引数を true に設定すると、SOAP RPC を格納する HTTP リクエストの本体と HTTP 応答本体の検証に使用できます。たとえば、Soap-1-1-FaultException 例外が返された場合、これを使用して SOAP フォールトのすべての部分要素を表示することができます。
この引数については『API リファレンス マニュアル』の Soap-1-1-HttpOperation.call の項目に記載されています。

SOAP ヘッダーの読み取りと書き込み

SOAP インターフェイスはまた、SOAP ヘッダーの読み取りみと書き込みをサポートします。次の例では、SOAP ヘッダーをエコーする Web サービスを呼び出しています。この SOAP オペレーションは "echoVoid" といい、引数を使用せず結果も返しません。単に呼び出しで使用された SOAP ヘッダーのエコーのみを実行します。
{import * from CURL.XML.SOAP}

{let xsd:String = "http://www.w3.org/2001/XMLSchema"}

|| 0 input arguments
{let input-arguments:{Array-of Soap-1-1-ArgumentDescriptor}=
    {new {Array-of Soap-1-1-ArgumentDescriptor}}
}

|| 0 output arguments
{let output-arguments:{Array-of Soap-1-1-ArgumentDescriptor}=
    {new {Array-of Soap-1-1-ArgumentDescriptor}}
}

|| construct a header as an array of XMLToken
{let input-headers:{Array-of XMLToken}={new {Array-of XMLToken}}}
|| the header element is "echoMeStringRequest" containing a string
{input-headers.append {new XMLStartElement,
                          {new XMLName,
                              "http://soapinterop.org/echoheader/",
                              "echoMeStringRequest"}
                      }
}
{input-headers.append {new XMLCharacters, "Hello, Header"}}
{input-headers.append {new XMLEndElement}}

|| operation descriptor
{let echo-void:Soap-1-1-HttpOperation=
    {new Soap-1-1-HttpOperation,
        || operation name
        {new XMLName,"http://soapinterop.org/", "echoVoid"},
        || url
        || {url "http://mssoapinterop.org/stk/InteropC.wsdl" },
        {url "http://www.whitemesa.net/interop/std/echohdr"},
        || SOAPAction value
        || "urn:soapinterop",
        "http://soapinterop.org/",
        input-arguments,
        output-arguments
    }
}

|| the actual SOAP call -- headers are passed a value
|| of keyword argument
{let (anys:#{Array-of any}, return-headers:#{Array-of XMLToken})=
    {echo-void.call headers=input-headers, trace?=true}
}

|| The output arguments are returned in array of anys
|| This soap call returns 0 arguments
{if anys.size !=0 then
    {error "expected 0 return arguments, but got " & anys.size}
}

|| The headers are returned as array of XMLToken.
|| The header passed back should have the same contents
|| as the string passed in -- "Hello, Header"
{if return-headers.size < 4 then
    {error "error in return headers"}
}
{if {type-of return-headers[0]} != XMLStartElement then
    {error "expected first element of return headers to be
    XMLStartElement"}
}
{if {type-of return-headers[1]} != XMLAttribute then
    {error "expected first element of return headers to be
    XMLAttribute"}
}
{type-switch return-headers[2]
 case chars:XMLCharacters do
    {output "content of return header element: " & chars.characters}
 else
    {error "expect XMLCharacters as second element of return headers"}
}
{if {type-of return-headers[3]} != XMLEndElement then
    {error "expected first element of return headers to be
    XMLEndElement"}
}

セキュリティとの関係

SOAP 呼び出しで起動された HTTP リクエストは、他の HTTP リクエストと同様のセキュリティ チェックに従います。セキュリティに関する制限については、「ネットワーク アクセスの規制」のセクションに記載されています。
作成したアプレットがユーザー所属の組織内の Web サービスにアクセスする限りにおいては、セキュリティによる問題はほとんどありません。