PHPにおけるsoapの使用例【SoapServerサービス側とSoapClientクライアント作成】

5504 ワード

この例ではPHPにおけるsoapの使い方について述べた.皆さんの参考にしてください.具体的には以下の通りです.
一、まずサーバー環境を設定する
phpを変更します.ini
extension=php_を追加する必要がありますsoap.dll(soap内蔵パッケージのロード)
soapを変更します.wsdl_cache_enabled=1をsoapに変更する.wsdl_cache_enabled=0これはsoapのキャッシュで、テストの時は0に変更したほうがいいです.オンラインが安定したら1に変更します.
soapにはwsdlとno-wsdlの2つのモードがあります
二、いくつかの関数を熟知している
1. SoapServer
SoapServerは、phpサーバ側のページを作成するときに呼び出す関数を定義し、応答データを返します.
書式:

$soap = new SoapServer($wsdl,$array); 


ただし、$wsdlはsoapで使用されるwsdlファイルであり、wsdlはWebサービスを記述する標準フォーマットであり、$wsdlをnullに設定するとwsdlモードを使用しないことを示す.$arrayは、SoapServerのプロパティ情報であり、配列です.SoapServerオブジェクトのaddFunctionメソッドは、クライアントによって呼び出される関数を宣言するために使用されます.構文フォーマットは次のとおりです.

$soap->addFunction($function_name);

ここで、$soapはSoapServerオブジェクトであり、$function_nameは呼び出す必要がある関数名である.
SoapServerオブジェクトのhandleメソッドは、ユーザーが入力して対応する関数を呼び出し、クライアントに処理した結果を返すために使用されます.構文の形式は次のとおりです.

$soap->handle([$soap_request]); 

ここで、$soapはSoapServerオブジェクト、$soap_requestは、ユーザーのリクエスト情報を表すオプションパラメータです.$soap_を指定しない場合requestは、サーバがユーザのすべての要求を受信することを示す.
2. SoapClient
SoapClientは、リモート・サーバ上のSoapServerページを呼び出し、対応する関数の呼び出しを実現します.
書式:

$soap = new SoapClient($wsdl,$array); 


パラメータ$wsdlと$arrayはSoapServerと同じです
SoapClientのメソッドでは、構文を次のように作成します.

$soap->user_function($params); 


ここで、$soapはSoapClientオブジェクト、user_functionは、サーバ側が呼び出す関数であり、$paramsは関数をインポートするパラメータです.
3. SoapFault
SoapFaultは、soapアクセス中に発生する可能性のあるエラーを生成するために使用されます.soapFaultオブジェクトの構文フォーマットを作成する
書式:

$fault = new SoapFault($faultcode,$faultstring); 


ここで、$faultcodeはユーザ定義のエラーコードであり、$faultstringはユーザカスタマイズのエラー情報である.soapFaultオブジェクトは、サーバー側のページにエラーが発生したときに自動的に生成されるか、ユーザーが自分でSoapFaultオブジェクトを作成したときに生成されます.Soapアクセス時に発生したエラーに対して、クライアントはSoapFalutオブジェクトをキャプチャすることで、対応するエラー情報を取得できます.クライアントがSoapFaultオブジェクトをキャプチャすると、次のコードでエラーコードとエラー情報を取得できます.

$fault->faultcode;//     
$fault->faultstring;//     


$faultは、前に作成したSoapFaultオブジェクトです.
4. SoapHeader
soapheaderはsoapのheader情報を記述するために用いられ、一般的に認証に用いられる.

/*
 *SoapHeader        :
 *'http://tempuri.org/'  namespace(       )
 *'MySoapHeader'     SoapHeader    
 *'array(...)'                  
 *'true'                header
*/

書式:

$h = new SoapHeader('http://192.168.0.153/hao/', 'auth', '123456789', false, SOAP_ACTOR_NEXT);


三、実例
wsdlモードを使用しないコード
サービス:

//     
class Test{
  public function auth($a)
  {
    if($a != '123456789'){
      throw new SoapFault('Server', '     ');
    }
  }
  function say()
  {
    return 'Hi11111';
  }
}
$srv = new SoapServer(null, array('uri' => 'http://192.168.0.153/hao'));
$srv->setClass('Test');
$srv->handle();


Testクラスのauthは認証判定であり,この方法はクライアントsoapheaderの方法に対応する.
クライアント:

//      
$cli = new SoapClient(null, array('uri' => 'http://192.168.0.153/hao/', 'location' => 'http://192.168.0.153/hao/test.php', 'trace' => true,'encoding'=>'utf-8'));
$h = new SoapHeader('http://192.168.0.153/hao/', 'auth', '123456789', false, SOAP_ACTOR_NEXT);
$cli->__setSoapHeaders(array($h));
try {
echo $cli->say();
} catch (Exception $e) {
echo $e->getMessage();
}


soapheaderにおけるauth対応サービス側authメソッド
認証しない場合は、次の2つの行を削除できます.

$h = new SoapHeader('http://192.168.0.153/hao/', 'auth', '123456789', false, SOAP_ACTOR_NEXT);
$cli->__setSoapHeaders(array($h));


wsdlモード
まずwsdlファイルを生成し、どのようにウェブサイトを生成するかについては
サービス:

//wsdl   
Require './server.class.php';
$server = new SoapServer('./server.wsdl');
$server->setClass('Server');
$server->handle();


server.class.phpクラスコード

class Server {
  public function auth($a){
    if($a != '123456789'){
    throw new SoapFault('Server', '     ');
    }
  }
  public function test() {
    return 'you are testing';
  }
}


クライアント:

//wsdl     
$soap = new SoapClient('http://192.168.0.153/hao/server.wsdl'); //     ,    dizzylion.wsdl URL 。
$h = new SoapHeader('http://192.168.0.153/hao/', 'auth', '123456789', false, SOAP_ACTOR_NEXT);
$soap->__setSoapHeaders(array($h));
try {
echo $soap->test();
} catch (Exception $e) {
echo $e->getMessage();
}


PHPの関連内容についてもっと興味のある読者は、「php socket用法総括」、「php文字列(string)用法総括」、「PHP数学演算技巧総括」、「php対象プログラム設計入門教程」、「PHP配列(Array)操作技巧大全」、「PHPデータ構造とアルゴリズム教程」、「phpプログラム設計アルゴリズム総括」及び『PHPネットワークプログラミングテクニックまとめ』
ここで述べたことが皆さんのPHPプログラム設計に役立つことを願っています.