前回のさらに続き?
SOAPとは、ネット越しに情報をやりとりする手段の一つです。
http://ja.wikipedia.org/wiki/SOAP_(%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB)
Webサービスのメイン手段として登場し、特徴としてはすべてをXMLでやりとりするため汎用化がしやすい(ということになっている)ことや、WSDLという設計図を利用して簡単にサービスが構築できる(ということになっている)ことがあります。
http://ja.wikipedia.org/wiki/WSDL
が、より簡単なXML-RPCや、もっと簡単にfile_get_contentsするだけで全てが終わるRESTなどが普及したため、あまり使われていません。
確かに出来ることはSOAPのほうが多いのですが、なにしろ面倒ですからな。
また、Yahooは最初からRESTしか無かったり、SOAPの主導権争いに嫌気がさしたGoogleの中の人がSOAP対応を打ち切るなど将来も微妙な感じです。
企業間通信やなどでは今でも使われているところはあるようですが、実際WebサービスとしてSOAPを提供しているところはググってもあまり出てきません。
イースト辞書WebサービスはSOAPにも対応しているのでそちらを使用してみましょう。
http://www.btonic.com/ws/index.html
WSDLに関しては、サーバ上のWSDLを直接参照することも出来ますが、まああまり迷惑をかけないよう拾ってきてローカルに保存しておきましょう。
WSDLファイルにはGetDiclistとかSearchDicItemといった要素が書かれていますが、これをSoapClient関数に読み込ませることによってSoapClient::GetDiclistやSoapClient::SearchDicItemといった関数を使えるようになります。
http://jp.php.net/manual/ja/book.soap.php
WSDLがWebサービスの設計図となっているのでこういう芸当が可能なのです。
というわけでとりあえずGetDiclistとSearchDicItemを作ってみます。
dict_soap.class.php
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
|
//検索を行うクラス
class Dict_Soap{
//URL
protected $url_service=
'http://btonic.est.co.jp/Netdic/Netdicv10.asmx';
//WSDLファイル
//protected $file_wsdl=
'http://btonic.est.co.jp/Netdic/Netdicv10.asmx?WSDL';
protected $file_wsdl='Netdicv10.wsdl';
//SOAPオブジェクト
protected $soap='';
//辞書リスト
protected $diclist=array();
//メソッド用パラメータ初期値
//辞書リスト取得
protected $param_GetDicList=array(
'AuthTicket'=>''
);
//検索
protected $param_SearchDicItem=array(
'AuthTicket'=>''
,'DicIDList'=>array(
'19553dab-aa51-43bb-9fb7-764153b647ac' //EJDict英和辞典
//'8a68bb8a-16ee-4b51-afaa-74c277bb600a'//Edict和英辞典
//'39124c12-6244-4c65-94eb-8b18c20c2898'//Wikipedia
)
,'QueryList'=>array(
'ScopeID'=>'ANYWHERE'
,'MatchOption'=>'EXACT'
,'MergeOption'=>'AND'
)
,'ContentProfile'=>array(
'FormatType'=>'XHTML'
,'ResourceOption'=>'URI'
,'CharsetOption'=>'WINJPENV'
)
,'SortOrderID'=>''
,'ItemStartIndex'=>'1'
,'ItemCount'=>'4'
,'CompleteItemCount'=>'2'
);
//コンストラクタ
function __construct($AuthTicket=false){
$this->soap = new SoapClient($this->file_wsdl);
//チケットがあれば
if($AuthTicket){
$this->$this->param_GetDicList['AuthTicket']=$AuthTicket;
$this->$this->param_SearchDicItem['AuthTicket']=$AuthTicket;
}
}
//使用可能な辞書のリストを取得
public function getDicList(){
//取得
$tmp=$this->soap->GetDiclist($this->param_GetDicList);
//返り値のうち必要な部分のみ取得
foreach($tmp->GetDicListResult->DicInfo as $key=>$val){
$this->diclist[$key]['DicID']=$val->DicID;
$this->diclist[$key]['FullName']=$val->FullName;
$this->diclist[$key]['Abbrev']=$val->Abbrev;
}
return $this->diclist;
}
//辞書を検索する
public function searchDicItem($string){
//検索語句セット
$this->param_SearchDicItem['QueryList']['Words']=$string;
//何故か返り値が常に見つからない
$ret=$this->soap->SearchDicItem($this->param_SearchDicItem);
return $ret;
}
#↓クラスのおわり
}
|
できました。
一部分テキトーなので辞書IDなんかがべた書きになってますがまあ気にしない。
さて実行。
soap.php
1
2
3
4
5
6
7
8
9
10
11
|
//インスタンス
require_once('./dict_soap.class.php');
$dictsoap=new Dict_Soap();
//$ret=$dictsoap->getDicList();
$ret=$dictsoap->searchDicItem('love');
print("<html><pre>");var_dump($ret);die();
|
実行結果。
object(stdClass)#3 (2) { ["SearchDicItemResult"]=> int(0) ["ItemList"]=> object(stdClass)#4 (0) { } } |
…あれー?
SearchDicItemがうまく動いてくれません。
送信メッセージ形式は合っている筈なんだが…
getDicListは結果がきちんと返ってきます。
二重配列内の、WSDLでminOccurs="1"と定義されている部分、たとえば$param_SearchDicItem['QueryList']['MatchOption']あたりを削除してみると正しく不正になる(どころか、正しくないことにApache毎落ちる)のでパラメータの指定が間違っているということもないと思います。
うむ、よくわからん。
今回は原因特定しきれなかったので相手が悪いのだと勝手に納得しつつ終了。