今更ですがSOAPを利用したWEB APIを触ることになったのですが、SOAPの仕様がわけわからん過ぎて困ったので基礎に立ち返って調べてみました。
SOAPにはWSDLというファイルがあって、事前にAPI定義をXMLで公開するみたいです。まずは「そもそもWSDLには何が記述してある?」かを追って見ることに。
WSDLとは
- そのWebサービスはどこにあるのか
- そのWebサービスは、どんなフォーマットのメッセージを使って利用するのか
- そのWebサービスは、どんな通信プロトコルを使ってメッセージをやり取りするのか
引用元:http://www.atmarkit.co.jp/ait/articles/0303/18/news003.html
SOAPとは、元はSimple Object Access Protocolの頭文字だったけど、もはやシンプルでもなんでもないものに複雑怪奇なものになっているとか。
WSDLのメリットは下記のようなのがあるとのこと。
Webサービスのために、そのインターフェイスを記述したWSDL文書が用意されていることは、Webサービスの利用者に大きな利得となる。開発ツールにWSDL文書を読み込ませることによって、Webサービスを呼び出すモジュールのコードを自動生成できるようになるからだ。
ふむふむ。
どの旅行代理店でもほぼ共通した内容だ。このような場合、業界団体では、Webサービスとして公開するホテル予約サービスシステムのインターフェイスを標準化することが考えられる。業界団体は、標準化されたインターフェイスの仕様を記述したWSDL文書を作成し、それを一般に公開することになるだろう。
昨今ではどこのWEBサービスでもSOAPを使っているところはほとんどないので、目論見通りにはならなかったみたいですね。
(1)WSDL文書は抽象的な定義と具体的な定義の、2つのステップで構成されている
だからこんなに定義の重複っぽいのが目につくのか。
この辺りを参考にさせていただきました。
http://www.atmarkit.co.jp/ait/articles/0304/24/news002.html
サンプルWSDL
一番シンプルなwsdlをめざして作ったけど既に謎だらけ。一つ一つ調べてみてコメントいれました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions <!-- 対象名前空間URIの定義。よくわからんけど任意の値で良いみたい。 多くのサンプルではそのWEBサービスのURIを記載していた。 --> targetNamespace="http://example.com/Service01" <!-- わからんけど親がtargetNamespaceなのに対して、子がxmlns:implみたいな印象を受けた。 任意の値でいいっぽい。 --> xmlns:impl="http://example.com/Service01" <!-- xmlnsは、各々で定義されてるxmlマークアップを使うということ。おまじない程度の理解で良さそう。 --> xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <!-- WEBサービスで使用されるmessage(インタフェース?)の抽象的定義。 --> <wsdl:message name="addHexString"> <!-- APIパラメータ名と型の定義 --> <wsdl:part name="text" type="xsd:string" /> <wsdl:part name="num" type="xsd:int" /> </wsdl:message> <wsdl:message name="addHexStringResponse"> <wsdl:part name="addHexStringReturn" type="xsd:string" /> </wsdl:message> <!-- 関連する抽象的な操作の集合。上のmessageで定義した内容の集合? --> <wsdl:portType name="Service01"> <!-- メソッドのインターフェース定義に対応する。 nameがメソッド名、parameterOrderが引数の順序。 --> <wsdl:operation name="addHexString" parameterOrder="text num"> <!-- input/output/faultという種類があるらしい。 それぞれのメッセージのフォーマットが上で定義したmessageに対応する。 --> <wsdl:input name="addHexString" message="impl:addHexString" /> <wsdl:output name="addHexStringResponse" message="impl:addHexStringResponse" /> </wsdl:operation> </wsdl:portType> <!-- 抽象的な操作やメッセージを具体的なプロトコルにやメッセージにバインディングする。 nameは、serviceで参照するための名前。 typeはどのportTypeに対応するかを指定(上で定義したportType)。 --> <wsdl:binding name="Service01SoapBinding" type="impl:Service01"> <!-- SOAPプロトコルにバインディング、RPC志向であることを明示してる。 文書指向というのもあるらしい --> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> <!-- portTypeで定義した内容をさらに具体的に定義? --> <wsdl:operation name="addHexString"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="addHexString"> <!-- SOAPメッセージ本体だとか。なんだよ本体って。 --> <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </wsdl:input> <wsdl:output name="addHexStringResponse"> <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <!-- 上のportType要素で定義したポートのうち、関連するポートをひとまとめにする。 --> <wsdl:service name="Service01"> <!-- nameはportTypeで定義した名前。 bindingは対応するbindingの名前。 --> <wsdl:port name="Service01" binding="impl:Service01SoapBinding"> <!-- 具体的なアドレスを指定 --> <wsdlsoap:address location="http://mac-book-air.local:8088/mockService01SoapBinding"/> </wsdl:port> </wsdl:service> </wsdl:definitions> |
率直な感想。
wsdlsoap:addressのlocationだけあればあとの定義いらなくね?と思った。

原田 敦

最新記事 by 原田 敦 (全て見る)
- Rails Engineでブログ機能追加するgemを作る - 2015年3月15日
- WEBエンジニア一人だけでサービスを作りきる方法-夫婦のための自動ごはん予定お知らせサービス「GoHaaan」制作でやったこと - 2015年3月7日
- CentOS6でMariaDBのDynamic Columnsを試してみた - 2015年2月28日