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ボディ
メッセージ内容
データ内容、メソッド名(サービス名)、パラメータ等
・エラー情報
エラーコード、エラー名、エラー内容等
属性
抽象的に定義
↓
具体的に定義
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アノテーションでマッピング可能
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のパス