【PHP】PHPでSOAP通信を行う方法のサンプルコード

PHPでSOAP通信を行う必要があったため、その方法を備忘録として記しておこうと思う。

サンプルコードもあります。

PHPの設定でSoap通信を利用可能にする方法

【PHPのバージョン】5.2.8

SOAP通信を行うには、まずPHP側での対応が必要になる。具体的にはphpinfo()を実行して以下のような表示がされなければ不可能。

soap.png

もし表示されていない場合は、自前でPHPを再構築する必要がある。ソースからインストールする場合はConfigureに「–enable-soap」を追加するだけでOK。

ここまで準備ができていれば、実装自体は非常に簡単。

PHPからサービスを実行する方法

$client = new SoapClient('【WSDLファイルのURL】');

こんな感じで書けばSOAP通信が可能となる。ここでいうWSDLファイルというのは、SOAP通信に必要となる定義情報が記載されたXMLのことで、通常はSOAPサービスを提供する側が用意しているはずなので、そのURLを指定すればよい。
WSDLファイルにはサービスやパラメータが定義されており、なんらかのドキュメントが用意されていればよいが、ない場合はこいつを解析する必要がある。今回の開発ではまさにそのパターンだった。WSDLの内容はざっくり書くとこんな感じ。

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="SoapTest">

    <!-- testProcのINPUTパラメータの詳細 -->
    <message name="getPage">
        <part name="id" type="xsd:int" />
    </message>
    <!-- testProcのOUTPUTの詳細 -->
    <message name="getPageResponse">
        <part name="ResultSet" type="xsd:string" />
    </message>

    <portType name="SoapTestPortType">
    <!-- SOAP通信時に呼び出すメソッド名とIN/OUT -->
        <operation name="testProc">
            <input message="typens:getPage" />
            <output message="typens:getPageResponse" />
        </operation>
    </portType>

    <!-- SOAP通信時の接続先 -->
    <service name="SoapTestService">
        <port name="SoapTestPort" binding="typens:SoapTestBinding">
            <soap:address location="http://XXXX/test.php" />
        </port>
    </service>

</definitions>

このようなファイルの場合、呼び出すメソッドは「testProc」となり、パラメータを設定する必要がある。それらを含めたPHPでの実装はこんな感じ。

$params = array('id' => 1);
$client = new SoapClient('【WSDLファイルのURL】');
$result = $client->testProc($params);

SOAP通信時のパラメータ設定は、Arrayの中に定義する。複雑な構造を持つパラメータであってもArrayの中にArrayを定義するような形で設定を行う。

これで、通常は行けるのだが今回の開発では、SOAP通信を使用した場合にそのリクエストとレスポンス情報をDBに書き込み、エラーが発生しても画面上はエラーとしないという要件があった。この為、以下のように実装した。

//パラメータセット
$params = array('id' => 1);

//エラーを無視するエラーハンドラに切り替える(実行後は元に戻す)
set_error_handler(array(__CLASS__, "soapErrHandler"));
try{
    $client = new SoapClient('【WSDLファイルのURL】', array('trace' => 1 ));
    //エラーハンドラ回復
    restore_error_handler();
} catch (Exception $e) {
    //エラーハンドラ回復
    restore_error_handler();
    //WSDLファイルの読み込みに失敗した場合の処理
}

try{
    //SOAP通信実行
    $result = $client->testProc($params);
} catch (SoapFault $e) {
    //SOAP通信の実行に失敗した場合の処理
}

まず、1つ目のTry-Catchだがこれが曲者で、WSDLファイルが見つからない場合Exceptionではなく、PHPの実行エラーとなってしまうためExceptionを発生させるため強引にこのような実装となった。また、リクエスト・レスポンス情報を取得するために、new SoapClientの引数に「array(‘trace’ => 1 )」を追加した。
これによって、

$client->__getLastRequest();
$client->__getLastResponse();

で取得が可能になる。
2つ目のTry-CatchはSOAP通信実行時にエラーが発生した場合は、SoapFaultをCatchすることでエラーが取得できる。

とりあえず、こんな感じ。
わかってしまえば意外と簡単だったが、ネットで検索しても情報が少なく足がかりを得るまでが大変だった。

SPONSORED LINK

参考サイトと管理人チーがお勧めする関連記事

SPONSORED LINK

Twitterでチーをフォローしよう!

この記事のシェアはこちらから!

アナザー通信『ここだけの話』

ブログ記事の裏話や主催イベントの予定が読める週刊メルマガを発行しています。
メールアドレスの登録だけで購読できる無料メルマガです!
詳しい内容が気になる方はこちらをご覧ください。

は必須項目です

お名前(姓名)

2 件のコメント

  • いつも拝見させて頂いております。
    教えて頂きたいのですが、最近パソコンをwindowsからmacにかえました。
    ただ、今までヤフオクで使っていたhtmlの出品テンプレートがソースしか表示されなくなってしまいました。
    safariでもchromeでもちゃんと表示されないのですがどうしたらみれるようになるのでしょうか?
    ご存知でしたら教えて頂けますか?

  • はじめまして!
    ヤフオクの通常入力機能は現在のところSafariとChromeには対応していないみたいですよ。Firefoxを使えば大丈夫だと思います。
    一度試してみてください。