rubyでSOAP-RPCサーバを構築する。

rubySOAP-RPCサーバを作成する。
注意:inputタグがテキストボックス処理されるので、全角にしてあります。
 参照:http://homepage2.nifty.com/hippos/soap4r/types.html
・前提条件
 テストとしてUserIdとPasswordを送られるとそれぞれの頭に"Ok-"をつけてUserIdとPasswordを返すというwebサービスを作ってみる。
 (実用無視)
 テストで作成するサーバ名は"TestServer"とする。
・準備
 1.gemでSOAP4Rをインストールする。
  http://dev.ctor.org/soap4r
  gem install soap4r
  しばらくすると、依存したパッケージのインストールを聞かれるので、とりあえずYes。
  しばらく待つと依存関係を含んでのインストールが完了する。

・流れ
 2.WSDLを作成する。
 3.スクリプトを作成する。(サーバ)←wdsl2ruby.rbを使用してスケルトン作成後、実装。
 4.クライアントを作成する。

 ※自分で作成してみた感じでは、2の前に、サービスとして利用するメソッドを決めておかないと、message要素が記述できない。。
 今回は上記前提条件より、下記の3つのメソッドを使い、webサービスを作成してみる。
・ServiceStart boolean(サービスを開始する)
・GetUserData string×2(送られたUserId,Passwordを受取処理をして返す)
・ServiceEnd (サービスを終了する)

WSDLとは
 Webサービスを記述するための、XMLをベースとした言語仕様。
それぞれのWebサービスがどのような機能を持つのか、それを利用
するためにはどのような要求をすればいいのか、などを記述する方
法が定義されている。
 データや操作を定義する部分が通信プロトコルに関する部分から
分離しているため、プロトコルエンコード形式などに関わりなく
フォーマットを再利用できる、という特徴を持つ。

・構成要素
definitions - WSDL全体をまとめるタグ。WSDLで使用する名前空間の属性を付加する。
types    - サービスで使用するデータタイプ(型)の定義。通常、XML Scheamを使用して定義を行う。
message   - 1回のrequest、またはresponseで使用するメッセージの定義。メッセージが使用するデータタイプ(を0個以上含む)
portType   - で定義されたメッセージをおぺれーそん(メソッド)の引数セットとしてまとめる。
binding   - 提供するサービスの具体的な詳細(プロトコル・メッセージ)の定義。soapサービスに関してはwsdl/soapビルトインを使用して記述する。
service   - 提供するサービスの具体的なアクセスポイント(URI)の定義。

xmlの中身(例)








2.WSDLを作成する。
 a.definitions
上記例参照
 b.types
メソッドが使用するデータ型を定義する。
(Integer,String,Arry,Hush,Boolean等)
単純型はこの辺をみて調べる
http://www.w3.org/TR/xmlschema11-2/#built-in-primitive-datatypes)後でみる。
複合型はxsd:complexTypeを使用する。
(今回はUserId,Passwordを返すので、複合型として下記の通り、設定)






配列の場合は下記の通り。
XML Schemaで配列などの新しい型を作る場合は、既存の型を拡張(制限)する形で定義する。
WSDLの規定でsoapエンコードのArray(base="soapenc:Array")を指定の型(ItemInfoResult[])で制限(xsd:restrinction)する。
配列の例









上記タグに名前空間を付ける。
・新しい型を定義した場合、SOAP encodeingが必要となるため、WSDLルートでsoap encoding名前空間を含ませる必要がある。
 例)xmlns:soapenc="http://schemas.xmlsoap.xmlsoap.orc/soap/encoding/"
注意点)
・ルート要素はsoap encodingの名前空間を含んでいる必要がある。(新しい型を定義した場合)
・ルート要素はtargetNamespace属性を指定する必要がある。(type要素で指定した方がWSDL定義の中で参照されるため。)

上記を参考にして下記の通り、設定する。












 c.message
提供するサービスのオペレーション上、やり取りする1方向分のメッセージ定義をする。
SOAP-RPCの場合、リクエスト・レスポンスでそれぞれメッセージが行き来するため、それぞれの単位で要素を記述する。
実際の要素はmessage要素配下にpart要素を記述することで配置する。part要素はtypes要素で定義した型かXML Schemaで定義されている単純型となる。

例)





以下、実際例)
#ServiceStartメソッドへのリクエストに引数はないため、メッセージ要素にpart要素は含まれない。
#レスポンスはbooleanで返すのでpart要素にbooleanを指定する。(booleanはXML Schemaの単純型なのでtypes要素での定義はなし)






#GetUserDataメソッドはリクエストにパラメータとして












 d.portType
message要素で定義したメッセージをoperation(=メソッド)要素としてまとめる。
operation要素は1つのinput要素と1つのoutput要素を含む。
WSDLでは下記4つの基本オペレーションをサポートしている。
・One-Way…サービスがメッセージを受信するのみ。operation要素はinput要素を含む。
・Request-Response…サービスはリクエストメッセージを受信し、レスポンスメッセージを返す。
また、エラー時に例外としてfault要素を定義できる。
・Solicit-response…Request-Responseの逆。サービスがリクエストメッセージを送信し、クライアントがレスポンスメッセージを返す。
output要素とinput要素を含む。また、Request-Responseと同様にfault要素を定義できる。
SOAP-RPCではRequest-Responseの形態をとるため、portTypeで定義する各オペレーションはすべてinput/output要素を包含している必要がある。
例)



<input message="typens:ServiceStartRequest"/>



<input message="typens:GetUserDataRequest"/>



<input message="typens:ServiceEndRequest"/>



 e.binding
binding要素ではportTypeで定義したオペレーションを物理モデルとして変換・使用されるのかを定義する。
下記の3つが主に使用される。
・HTTP-POST
・HTTP-GET
SOAP
SOAPサービスの場合、組み込みの拡張定義を使用して定義を行う。
bindingタグのname/type属性を使用し、type属性でどのportTypeをbindするかを指定する。
例)



以下の要素を内包する。
soap:binding要素
WSDL1.1ではSOAP1.1のための定義が組み込まれているので、これを使用し、SOAP特有の定義を行う。
例)


type属性にRPCが指定された場合、SOAPメッセージのリクエストにoperation(メソッド)名とそのパラメータ、レスポンスに戻り値が含まれることを意味する。
また、transport属性ではHTTPプロトコルの仕様を宣言している。
・operation要素
サービスが提供する各operationの手以後を行う。operation要素ではそれぞれのoperationで使用するinput/outputを定義する要素を含む。
また、SOAPを使用する場合は、soap:operation要素を含む。
例)



<input name="ServiceStartRequest">


soap:operation要素ではsoapAction属性を指定できる。SOAP1.1では必須なので、なにもなくても(空白を)指定する必要がある。
soap:body要素(operation要素内に配置)
soap:body要素はoperationのinput/output要素の子要素としてメッセージをSOAPエンコーディングで処理するかの定義を行う。
例)


上記の通りにすると、下記の通りの記述となる。
例)





<input name="ServiceStartRequest">






<input name="GetUserDataRequest">






<input name="ServiceEndRequest">





 f.service
service要素では提供するサービスのアクセスポイントを定義する。
例)


binding="typens:TestServerBinding">




・全貌は下記の通り
































<input message="typens:ServiceStartRequest"/>



<input message="typens:GetUserDataRequest"/>



<input message="typens:ServiceEndRequest"/>







<input name="ServiceStartRequest">






<input name="GetUserDataRequest">






<input name="ServiceEndRequest">





binding="typens:TestServerBinding">




これを.wsdl拡張子で保存する。
 g.rubyファイルを自動生成する。
soap4r付属のwsdl2rubyスクリプトを使用し、作成したwsdlファイルを生成する。

ruby wsdl2ruby.rb --wsdl testServer.wsdl --type server --force


すると下記3つのファイルが作成される。
・TestServer.rb
・TestServerService.rb
・TestServerServiceServant.rb
で、作成されないので、エラーがあるという判断。
上記WSDLファイルをとりあえず、精査。
以後追って追記。&その後の流れもそこで。

やってる時間がねー。別の仕事を片付けてしまおう。。。