脳みそスワップアウト

揮発性なもので。おもにPHPのこととか。

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()

関連するphp.ini