SOAP通信

SOAPとは?

SimpleObjectAccessProtocol
XMLを用いたRPC
・メッセージの記述方法:XML
・データ伝送方法:HTTP(S)
を用いる通信プロトコル
異なる開発言語環境でも、インターネットを介したデータの交換や相互運用が可能になる
入出力チェックが必要等の複雑な通信に用いられる
WSDLを利用する事でSOAPクライアント側では実装を大幅に省略できる

SOAPの仕様

・エンベロープ構成要素
 ┣ メッセージ構成
 ┗ 処理仕様
・エンコーディング規則
 ┗ データのシリアライズメカニズム
・RPC表現規則
 ┗ 要求と応答の規則

SOAPメッセージ構成

SOAPメッセージ
 ┗ ヘッダ
 ┗ SOAPエンベロープ
  ┗ SOAPヘッダ
  ┗ SOAPボディ

ヘッダ

≠SOAPヘッダ
SOAPである事をサーバに通知する。
※ヘッダ例
POST /StockQuote HTTP/1.1
Content-Type: text/xml; charset="utf-8"
Content-Length: *****
SOAPAction: "http://officeyone.s324.xrea.com/officeyone.shop"

SOAPエンベロープ

Envelope:封筒
XML文書における最上位要素(要素名: Envelope)
子要素としてSOAPヘッダ、SOAPボディを持つ
SOAPエンベロープ
 ┗ SOAPヘッダ
 ┗ SOAPボディ
SOAPヘッダ
SOAPメッセージの宛先
SOAPボディ
メッセージ内容
データ内容、メソッド名(サービス名)、パラメータ等
・エラー情報
エラーコード、エラー名、エラー内容等

属性

soap_list
抽象的に定義

具体的に定義

targetNamespace属性

SOAPサービスが属する名前空間
とある属性において他の属性の値を参照する場合に、
名前でなくtargetNamaspace+名前で指定する事で正確性と分かり易さが向上する

message属性

SOAPサービスの抽象定義
<wsdl:message name="myMethodRequest">
 <wsdl:part name="prm1" type="xsd:string"/>
 <wsdl:part name="prm2" type="xsd:int"/>
</wsdl:message>
※Java
int myMethod(String prm1, int prm2){ ~ }

types属性

型定義
<wsdl:types>
 <schema targetNamespace=~>
  <complexType name="MyType">
   <sequence>
    <element name="pam1" type="string" />
    <element name="pam2" type="int" />
   </sequence>
  </complexType>
 </schema>
</wsdl:types>
<wsdl:message name="ReqMsg">
 <wsdl:part name="reqParam" type="xdd1:MyType" />
</wsdl:message>

portType属性

配下のoperation属性でSoapサービス(メソッド)における
・input
・output
・エラー
を定義する
Javaにおけるインターフェースに該当する。
メソッドを抽象的に定義する。
メソッドの具体的な定義は具象クラスにて実装する
<wsdl:message name="ReqMsg">
 <wsdl:part element="req:MyRequest" name="reqParam"/>
</wsdl:message>
<wsdl:message name="ResMsg">
 <wsdl:part element="res:MyResponse" name="resParam"/>
</wsdl:message>
<wsdl:portType name="MyPortType">
 <wsdl:operation name="myOperation">
  <wsdl:input message="svc:ReqMsg"/>
  <wsdl:output message="svc:ResMsg"/>
  エラーportTypeは省略可
 </wsdl:operation>
</wsdl:portType>

operation属性

operation=Javaにおけるメソッド
Javaコードにおける@WebMethodアノテーションでマッピング可能
soap1

binding属性

portType属性で定義した項目について具体的に定義する。
プロトコル、URL等
<wsdl:portType name="MyPortType">
 <wsdl:operation name="myOperation">
  <wsdl:input message="svc:ReqMsg"/>
  <wsdl:output message="svc:ResMsg"/>
  エラーportTypeは省略可
 </wsdl:operation>
</wsdl:portType>

<wsdl:binding name="MyBinding" type="svc:MyPortType">
 <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
 <wsdl:operation name="myOperation">
  <soap:operation soapAction=""/>
   <wsdl:input>
  <soap:body/>
  </wsdl:input>
  <wsdl:output>
   <soap:body/>
  </wsdl:output>
 </wsdl:operation>
</wsdl:binding>

port属性

ネットワークアドレスを定義する
<wsdl:binding name="MyBinding" type="svc:MyPortType">
 <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
 <wsdl:operation name="myOperation">
  <soap:operation soapAction=""/>
   <wsdl:input>
  <soap:body/>
  </wsdl:input>
  <wsdl:output>
   <soap:body/>
  </wsdl:output>
 </wsdl:operation>
</wsdl:binding>

<wsdl:service name="MyService">
 <wsdl:port binding="svc:MyBinding" name="MyInfo">
  <soap:address location="http://localhost:80/MyService/services/MyInfo" />
 </wsdl:port>
</wsdl:service>

SOAPメッセージ例

<SORP-ENV : Envelope
 xmlns : SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
 SOAP-ENV : encodingStyle="http://schemas.xal soap.org/soap/encoding">
  ※省略可
  <SOAP-ENV : Header>
  ~
  </SOAP-ENV : Header>
  
  <SOAP-ENV : Body>
   ※RPCで指定するメソッド名(サービス名)及びパラメータ
   <methodA>
    <param>999</paraml>
    <param>AAA</paraml>
   </methodA>
  </SOAP-ENV : Body>
</SORP-ENW : Envelope>

エンコード

方式
XMLリテラル <value>システム開発</value>
SOAP <value xsi:type="xsd:string">システム開発</value>

WSDL

Web Services Description Language
ネットワーク上に公開されているWEBアプリケーションについて
別のプログラムがそのアプリケーションを利用する為には以下が定められている必要がある。
・WEBアプリケーションの場所(URI)
・WEBアプリケーションがやり取りするメッセージのフォーマット
・WEBアプリケーションの通信プロトコル
このインターフェイスをXML形式で記述する為の言語
またはこの言語記述された文書そのもの(=WSDL文書)

XSD

XMLスキーマ定義ファイル
WSDLで指定可能

WSDL例

実際に公開されている通貨の交換比率の提供サイト用((http://www.xmethods.net/))WSDL
<?xml version = "1.0"?>
<definitions name = "CurrencyExchangeService"
 targetNamespace = "http://www.xmethods.net/sd/CurrencyExchangeService.wsdl"
 xmlns:tns="http://www.xmethods.net/sd/CurrencyExchangeService.wsdl"
 xmlns:xsd = "http://www.w3.org/1999/XMLSchema"
 xmlns:soap = "http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns = "http://schemas.xmlsoap.org/wsdl/">
 
 ※メッセージの定義(メソッド、引数、型)
 <message name = "getRateRequest">
  <part name = "country1" type = "xsd:string"/>
  <part name = "country2" type = "xsd:string"/>
 </message>
 
 <message name = "getRateResponse">
  <part name = "Result" type = "xsd:float"/>
 </message>
 
 ※messageタグで定義されたメソッドの名称、IN/OUT定義
 <portType name = "CurrencyExchangePortType">
  <operation name = "getRate">
   <input message = "getRateRequest" name = "getRate"/>
   <output message = "getRateResponse" name = "getRateResponse"/>
  </operation>
 </portType>
 
 ※portTypeタグで定義されたメソッドのフォーマット、プロトコル定義
 <binding name = "CurrencyExchangeBinding" type = "CurrencyExchangePortType">
  ※RPCである事を通知
  <soap:binding style = "rpc" transport = "http://schemas.xmlsoap.org/soap/http"/>
  <operation name = "getRate">
   <soap:operation soapAction=""/>
   <input>
    <soap:body use = "encoded" namespace = "urn:xmethods-CurrencyExchange"
     encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"/>
   </input>
   <output>
    <soap:body use = "encoded" namespace = "urn:xmethods-CurrencyExchange"
     encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"/>
   </output>
  </operation>
 </binding>
 
 <service name = "CurrencyExchangeService">
  <documentation>Returns the exchange rate between the two currencies</documentation>
  <port name = "CurrencyExchangePort" binding = "CurrencyExchangeBinding">
   <soap:address location = "http://services.xmethods.net:80/soap" />
  </port>
 </service>
</definitions>

API

Axis2

アクシス・ツー
JavaにおけるXML技術に関するフレームワーク
・SOAPメッセージの送受信
・WSDL取得
・WSDLからサーバ/クライアントの実装クラスを自動生成
REST方式のWEBサービスの作成/利用
が可能

JAX-WS

Java Api for XML-Based Web Services
SOAPサービスの為のAPI
Jax-RPCの後継
JavaSE標準

JAX-RS

Java API for RESTfull Web Services
RESTプロトコル」参照

WSIMPORT

JAX-WSクライアントアプリケーションを生成するコマンドラインツール
(wsimport.exeがJDK\Binにある)
WSDLを引数として渡すとSOAPクライアントに必要なJAVAのソースコードを自動生成する。
例:「駅すぱあと」のWSDLから路線検索WebサービスのJavaソースコードを生成
wsimport -s path -p mypack.jaxws http://wstest.railgo.jp/Expservice06.asmx?WSDL
→mypack.jaxwsにソースファイル、クラスファイルが生成される。
-s path ソースの保存パス(ディレクトリは事前に作成しておく事)
-p package パッケージ
WSDLのパス

言語

次の記事

COBOL