PHPでSoap Client
PHPで久しぶりにSOAP接続することになった。
たまにしか使わなくて忘れていたのでメモ。
<?php $wsdl = 'http://PATH/TO/WSDL'; $opt = [ 'trace'=>1, 'location'=> 'https://PATH/TO/END_POINT', // change end point // 'uri'=> '', // change namespace ]; $c = new SoapClient($wsdl, $opt); $authHeader = new SoapHeader('http://PATH/TO/NS', 'AuthElementName', [ 'UserName' => $username, 'Password' => $password, ]); $c->__setSoapHeaders([$authHeader]); try { $result = $c->remoteFunctionName('foo', 'bar'); } catch(\Exception $e) { // エラー処理 var_dump(get_class($e), $e->getCode(), $e->getMessage()); } var_dump($result); var_dump($c->__getLastRequestHeaders()); var_dump($c->__getLastRequest()); var_dump($c->__getLastResponseHeaders()); var_dump($c->__getLastResponse());
SoapClientのオプション
trace=1
で、実際に送信されたリクエスト/レスポンスを覗けるようになるので、開発中はこれをつけておくといい。location
で、エンドポイント(接続先)を変更できる。
開発環境やモックに向けたりするために使う。
Soapヘッダ
- SoapHeaderで表現する。
- 複数のSoapHeaderをSoapClientに設定できる。
- カスタム認証を行う場合、そのElement名とKey名に注意。
Key名を間違うと反映されない。(例: UserNameを誤ってUsernameと設定すると送信されない。)
実行
- 実行はマジックメソッドになる。低レイヤのメソッドとして
__soapCall()
,__call()
も存在する。 - 「データなし」の表現方法でトラブることがままある。
クライアントライブラリを作るなら、__call()
に渡す前に加工してやると親切かもしれない。
PHP側として- nullを設定するのか
- 空文字を設定するのか
- 要素ごと定義しないのか
デバッグ
- 以下4メソッドはデバッグに有用。利用には
trace=1
のオプションがSoapClientに必要。__getLastRequestHeaders()
,__getLastRequest()
,__getResponseHeaders()
,__getLastResponse()