PEAR::SOAP サーバ側

PEAR::SOAPSOAPサービスを作成するのはNuSOAPよりちょっとだけ手間がかかる。

  • classを作成する。そのクラスでは提供したいメソッドのほかに__dispatch()という名前のメソッドを実装する。といってもサンプルにあるようにパラメタでメソッド名が渡ってくるので、同じ名前のメソッドを呼ぶようにしておけばほとんどの場合問題ないと思う。
  • HTTP GETで来たらDISCOやWSDLを返却するようにできる。これもサンプルの通りに書いておけばOKみたい。
  • NuSOAPで復帰値を連想配列で返却していた場合、SOAP_Valueクラスの配列に修正する必要があるようだ。
  • 後はexample/server.phpを参照

このあたりがちょっと面倒なので、標準のものを拡張するだけで、後は自分が提供したいメソッドだけ書けばいいようにできると便利なのにと感じた。(そういう風に自分で作ればいいんだけど)

それでclassを作成するのが面倒な場合にはexample/server2.phpにあるように自分でハンドラを書いてしまえばいいようだ。

require_once('SOAP/Server.php');

/**
 * 自分の提供するサービス
 */
function myService($param1, $param2, $param3)
{
    $result = array(
        new SOAP_Value('resutl1', 'string', 'foo'),
        new SOAP_Value('result2', 'string', 'bar'),
        new SOAP_Value('result3', 'string', 'baz'),
    );
    
    return $result;
}

/**
 * 来たメソッド名をそのまま呼び出す。
 */
function myCallHandler($methodname, $args)
{
    return @call_user_func_array($methodname, $args);
}

$server = new SOAP_Server;
$server->setCallHandler('myCallHandler', false);

if (isset($_SERVER['REQUEST_METHOD']) &&
    $_SERVER['REQUEST_METHOD']=='POST') {
    $server->service($HTTP_RAW_POST_DATA);
} else {
    require_once 'SOAP/Disco.php';
    $disco = new SOAP_DISCO_Server($server,'ServerExample');
    header("Content-type: text/xml");
    if (isset($_SERVER['QUERY_STRING']) &&
       strcasecmp($_SERVER['QUERY_STRING'],'wsdl')==0) {
        echo $disco->getWSDL();
    } else {
        echo $disco->getDISCO();
    }
    exit;
}
  • しかし、上記の方法ではWSDLを生成することができない。WSDLのためにはexample/server2.phpにあるようにclassでやる必要があるようだ。(少なくとも、PEAR::SOAPの0.8RC3では)