さて、WSDLってのがよくわかってないが、ちまたのものを参考にする
http://codezine.jp/article/detail/199
http://soap.amazon.co.jp/schemas3/AmazonWebServices.wsdl
この辺はとても勉強になった
作ったWebサービスは文字列を渡したら検索結果を戻すもの
Amazonなどの検索サービスと思ってもらっていい。本の情報の構造体の配列を返す
配列はWSDLでは
<xsd:complexContent>
<xsd:restriction base="soapenc:Array">
<xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="typens:Details[]" />
</xsd:restriction>
</xsd:complexContent>
こんな感じで定義するようだったので、設定してみるのだが、"soapenc:Array"が何度やっても.NetのWSDLエディタ
でエラーになる
restriction,attributeの行で "Array~要素はこのコンテキストではサポートされません"
的なエラーが出る
しかしどこのサンプルを見てもこの書き方
どうやらsoapenc自体を「そんなものはしらん」と思っているらしい。バカなー
ちなみにPHPで呼び出すと動きます。.Netだと動かない。
そしてすでにどこで見つけたかも忘れたが、外国の掲示板で同じように苦しんでいる人がいて、
「.Netではsoapencは使えないから、全部消せ」みたいな返事をしている(のではないかと思われる)のを発見
ほんとかどうかしらないが、たしかにsoapencでエラーになっていたのは確かなので、soapencを消すと動く
でも配列使いたいんだけどどうすればいいんだ
またあれこれ調べる。
今自分が書いているのはRPC/ENCODEといわれる形のWSDLだ。
だってそのサンプルが圧倒的に多かったから
んで、どうやら.NetはLiteral/Document推奨らしい
ようわからんが、Literal式にしてみよう
配列はこれを参考にする
http://msdn.microsoft.com/ja-jp/library/aa979697(v=office.12).aspx
literalでの受け渡しはこれがわかりやすい
http://133.145.224.19/Prod/comp/soft1/manual/pc/d3U3120/EU310045.HTM
戻り値用構造体の定義
<xsd:complexType name="BookResults">
<xsd:sequence>
<xsd:element name="Result" type="tns:BookResult" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="count" type="xsd:int" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="BookResult">
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="1" name="writer" type="xsd:string"/>
<xsd:element minOccurs="0" maxOccurs="1" name="title" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
BookResultが元になる構造体で、本の名前とタイトルが入ってる
その構造体の配列と、本の件数を持つ構造体gBookResults
実際はこのBookResultsを戻り値で返す
受け渡し構造体の定義
<xsd:complexType name="param">
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="1" name="para1" type="xsd:string"/>
<xsd:element minOccurs="0" maxOccurs="1" name="para2" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
二つの文字列が入った構造体(クラス)を引数で渡す
そいつら用の要素
<xsd:element name="param" type="tns:param"/>
<xsd:element name="BookResults" type="tns:BookResults"/>
後はmessageで
<wsdl:message name="getBookRequest">
<wsdl:part name="Resultset" element="tns:param"/>
</wsdl:message>
<wsdl:message name="getBookResponse">
<wsdl:part name="Resultset" element="tns:BookResults"/>
</wsdl:message>
こんな感じで受け渡せばいいようだった
これでWSDLもできたので、実行してみるが本のデータ値が入らない……
PHPもよくわかってないだけあって少し時間がかかった
PHPのWebサービス側での返却値は
$book = array();
$bookdata = new stdClass;
$bookdata->title = "てすと";
$bookdata->writer = "てすと2";
array_push($book,$bookdata);
$para = new stdClass;
$para->result = $book;
$para->count =3;
return $para
という風に作る
最初$bookdataをarrayで作ってどうにもダメだった。stdClassじゃないとあかんようである
もちろん引数のも構造体なので、クライアント側で構造体にパラメータ入れてやって投げること
.Netクライアント側では、WSDLのtypeで指定したBookResultなどの構造体は普通にプロキシクラスが
使えるようにしてくれるので、簡単に取れます