これは、HTTP を介して SOAP メッセージを送受信する、完全に PHP 言語で記述された一連の PHP クラスであるオープン ソース ソフトウェアであり、NuSphere Corporation (http://dietrich.ganx4.com/nusoap/) によって開発されています。 NuSOAP の利点の 1 つは、拡張ライブラリのサポートを必要とせず、この機能により NuSoap をすべての PHP 環境で使用できるようになり、サーバーのセキュリティ設定の影響を受けないことです。
方法 1:
コードをコピーする コードは次のとおりです。
🎜>
include('NuSoap.php');
// パラメータはサーバーの WSDL です
$client = newsoapclient('http:// localhost/Webservices/ Service.asmx?WSDL', 'wsdl');
// パラメーターを配列形式に変換して渡します
$aryPara = array('strUsername'=>'username', 'strPassword'=> MD5('password'));
//リモート関数の呼び出し
$client->call('login',$aryPara); 🎜>//echo $ client->debug_str;
$document=$client->document;
echo <<
$document
? 🎜>
方法 2: プロキシ呼び出し
コードをコピー
< ? require('NuSoap.php');
//soapclient オブジェクトを作成します。パラメータはサーバーの WSDL$client=newsoapclient('http: //localhost/Webservices/Service.asmx ?WSDL', 'wsdl');
//プロキシ クラスを生成します
$proxy=$client->getProxy(); //リモート関数を呼び出します
$ aryResult=$proxy->login('username',MD5('password'));
//echo $client->debug_str; 🎜>
$document=$ proxy->document;
echo
;SOAP-ENV:エンベロープ SOAP-ENV :encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/” xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/envelope/” xmlns:xsd=”http://www.w3.org/2001/XMLSchema” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:SOAP-ENC=”http:/ /schemas.xmlsoap.org/soap/encoding/” xmlns:si="http://soapinterop.org/xsd">
ソープドキュメント;
?>
NuSoap を使用して .NET WebService または J2EE WebService を呼び出す多くの友人は、中国語の文字化けの問題に遭遇したことがあるかもしれません。この問題の原因と対応する解決策を以下に紹介します。
NuSoap が WebService を呼び出すときに文字化けが発生する理由:
通常、WebService を開発するときは UTF-8 エンコーディングを使用します。このとき、
$client を設定する必要があります。 - >soap_defencoding = 'utf-8';
同時に、xml は同じエンコーディングで渡す必要があります:
$client->xml_encoding = 'utf-8' ;
この時点ではすべて正常であるはずですが、結果を出力すると、返されたコードが文字化けしていることがわかりました。
NuSoap が WebService を呼び出すときに文字化けするコードの解決策:
実際、デバッグ機能をオンにしている友人は、$client->response が正しい結果を返すと信じていますが、なぜ $result なのか= $client->call($action, array('parameters' => $param)); しかし、それは文字化けしたコードですか?
NuSoap コードを調べると、xml_encoding が UTF-8 に設定されている場合、NuSoap は decode_utf8 の設定を検出し、それが true の場合、PHP の utf8_decode 関数が実行され、NuSoap がデフォルトになることがわかります。
$client->soap_defencoding = 'utf-8';
$client->decode_utf8 = false; = 'utf-8 ';
補足
NuSOAP は、WEB サービスを作成または呼び出すために使用される、PHP 環境の WEB サービス プログラミング ツールです。これはオープンソース ソフトウェアであり、現在のバージョンは 0.7.2 で、SOAP1.1、WSDL1.1 をサポートし、SOAP1.1 および WSDL1.1 をサポートする他のシステムと相互運用できます。 NuSOAP は完全に PHP 言語で記述されており、一連の PHP クラスで構成されています。この機能により、NuSOAP はすべての PHP 環境で使用でき、サーバーのセキュリティ設定の影響を受けません。
1. NuSOAP を入手してインストールします。
NuSOAP プロジェクトは、SourceForge 上に構築されています。ネットワーク アドレスは、http://sourceforge.net/projects/nusoap/ です。 NuSOAP 。
NuSOAP のインストールは比較的簡単です。ダウンロードした NuSOAP ファイルをサーバーにコピーします。PHP コードがアクセスできる限り、このファイルは別のディレクトリに配置することも、プログラム コードと同じディレクトリに配置することもできます。これらのファイルにアクセスするだけです。
この記事のテスト環境は PHP4.3.2 および NuSOAP バージョン 0.7.2 に基づいており、NuSOAP は WEB ディレクトリ "/nusoap" にインストールされており、lib とsamples の 2 つのサブディレクトリがあります。このうち、lib ディレクトリには NuSOAP のすべてのソース コード ファイルが保存され、samples ディレクトリには NuSOAP 開発チームが提供するいくつかのサンプルが含まれています。テストファイルはWEBディレクトリ「/nusoap」に保存されます。
2. NuSOAP の使用
NuSOAP は PHP クラスで構成されており、最もよく使用されるのはクラスsoap_serverとクラスsoapclientです。 WEBサービスの作成にはsoap_serverクラスを使用し、WEBサービスへのアクセスにはsoapclientクラスを使用します。
2.1 簡単な例: Hello World
この例では、NuSOAP を使用して単純な WEB サービスを作成し、NuSOAP を使用してこのサービスを呼び出すクライアント プログラムを作成します。このサービスの唯一の機能は、文字列「Hello World」をクライアントに返すことです。まず、WEB サービス プログラム コード ファイル "/nusoap/nusoap_server1.php" を作成します。
//NuSOAP ソース ファイルを現在のコード ファイルにインクルードします
コードをコピーします コードは次のとおりです:
require_once("lib/nusoap.php")
//サービス プログラムを定義します
関数 hello () {
return 'Hello World!';
}
//soap_server クラスのインスタンスであるサービス オブジェクトを初期化します。
$soap = newsoap_server; //登録が必要です。クライアントがアクセスするサービス オブジェクト プログラムの register メソッドを呼び出します。
//リモートクライアントは登録されたプログラムのみにアクセスできます。
$soap->register('hello'); //最後のステップは、クライアントによって送信されたデータを post メソッドを通じてサービス オブジェクトのサービス メソッドに渡すことです。
//サービス メソッドは入力データを処理し、対応する関数またはメソッドを呼び出し、正しいフィードバックを生成してクライアントに送り返します。
$soap->service($HTTP_RAW_POST_DATA);
?>
コードをコピー コードは次のとおりです:
//NuSOAP ソース ファイルを現在のコード ファイルに含めます
require_once(“lib/nusoap.php”);
// クライアント オブジェクトを初期化します。オブジェクトは、soapclient クラスのインスタンスです。
//サービス プログラムの URL アドレスを、soapclient クラスのコンストラクターに渡します。
$client = newsoapclient('http://127.0.0.1/nusoap/nusoap_server1.php'); //クライアントオブジェクトのcallメソッドを使用してWEBサービスを呼び出すプログラム
$str= $client-> ;call('hello'); //クライアント オブジェクトの getError() メソッドを使用して、呼び出しプロセスにエラーがあるかどうかを確認できます。
//エラーがない場合、getError() メソッドは false を返します。エラーがある場合、getError() メソッドはエラー情報を返します。
if (!$err=$client->getError()) {
echo ” プログラムは次を返します:”,htmlentities($str,ENT_QUOTES);
} else {
echo ” エラー: ",htmlentities($err,ENT_QUOTES);
}
?>
コードをコピーします。 コードは次のとおりです。 :
require_once(“lib/nusoap.php”);
function concatenate($str1,$str2) {
if (is_string($str1) ) && is_string($str2) )
return $str1 . $str2;
else
return newsoap_fault('Client',",'連結関数のパラメータは 2 つの文字列である必要があります');
}
$soap = 新しいsoap_server;
$soap->register('concatenate');
$soap->?>
2.1 節の WEB サービスプログラムのコードと比較すると、以下の 2 点に注意してください。
コードは次のとおりです: require_once("lib/nusoap.php");
$client = newsoapclient('http://127.0.0.1/nusoap) /nusoap_server2.php');$parameters=array(' string 1',' string 2');
$str=$client->call('concatenate',$parameters); if (!$err= $client->getError()) {
echo ” プログラムは次を返します:”,$str;
} else {
echo ” エラー:”,$err; }
?> ;
NuSOAP クライアントがパラメータを指定して WEB サービスを呼び出すとき、配列を使用してパラメータを渡します。 $parameters は、各パラメータの値を順に含む配列です。クライアントがリモート サービス プログラムを呼び出すときは、2 つのパラメーターを指定した call メソッドを使用します。最初のパラメーターはサービス プログラムの名前で、2 番目のパラメーターはサービス プログラムのパラメーター配列 (ここでは $parameters) です。ブラウザを介して上記のクライアント プログラムにアクセスすると、ブラウザには次の文字列が表示されます: "Program returns: String 1 String 2"
次に、エラー パラメータを WEB サービス プログラムに渡し、上記のクライアント プログラムを変更してみます。パラメーター配列を生成するステートメントを $parameters=array("String",12) に変更し、ブラウザーを介してクライアント プログラムにアクセスすると、ブラウザーに次の文字列が表示されます。「エラー: クライアント: 連結関数。パラメーターは次のようになります。」 2本の弦」。 WEB サービス プログラムは、渡されたパラメータの 1 つが文字列ではないと判断し、soap_fault を通じてクライアントにエラー メッセージを返します。
2.3 デバッグ方法
NuSOAP では、一般的に使用される 3 つのデバッグ方法があります。
2.3.1 soapclient クラスのリクエストおよびレスポンスのメンバー変数
最も直接的なデバッグ方法は、アクセスのプロセスを確認することです。クライアントから送信されるリクエスト情報とサーバーから返されるレスポンス情報。 soapclient クラスのリクエストおよびレスポンスのメンバー変数には、この情報が含まれています。プログラム内でこれら 2 つの変数の内容を表示すると、プログラムの実行ステータスを分析するのに役立ちます。以下のコードを見てください:
コードをコピー コードは次のとおりです:
require_once( “lib/nusoap .php");
$client = newsoapclient('http://127.0.0.1/nusoap/nusoap_server2.php');
$parameters=array(' string 1',' string 2′ );
$str=$client->call('concatenate',$parameters);
if (!$err=$client->getError()) {
echo ”プログラムの戻り値: ",$str;
} else {
echo " Error: ",$err;
}
//リクエスト変数とレスポンス変数の内容を以下に示します
echo '
echo 'Request:';
echo '
',htmlspecialchars($client->request,ENT_QUOTES),'🎜>echo 'Response: ';
',htmlspecialchars($client->response,ENT_QUOTES ),'
?> >
2.3.2soapclient クラスの debug_str メンバー変数
soapclient クラスの debug_str メンバー変数は、より詳細なデバッグ情報を提供します。この変数の内容を表示すると、プログラムのデバッグに役立ちます。 2.3.3 WEB サービスプログラムが提供するデバッグメソッド
WEB サービスプログラムのコードでは、soap_server クラスのインスタンスを作成する前に、変数 $debug=1 を定義します。デバッグ情報はメモとして使用され、SOAP メッセージの最後に配置されてクライアントに返されます。クライアントは、WEB サービスの応答情報を参照することでデバッグ情報を確認できます。
コードをコピーコードは次のとおりです: require_once("lib/nusoap.php) ");
function concatenate($str1,$str2) {
if (is_string($str1) && is_string($str2))
return $str1 . $str2;
else
return newsoap_fault('Client',",'連結関数のパラメータは 2 つの文字列である必要があります');
}
$debug=1; //デバッグを定義
$soap = newsoap_server;
$soap->register('concatenate');
$soap->service($HTTP_RAW_POST_DATA);
2.4 WSDL のサポート
NuSOAP の WSDL サポートは、クラス "WSDL" を通じて内部的に実装されます。NuSOAP ユーザーは、soap_server クラスとsoapclient クラスを正しく使用することで、内部 WSDL クラスがどのように機能するかを気にする必要はありません。 1 WSDL をサポートする WEB サービスを作成します
WEB サービス プログラムの WSDL サポートを実装するには、soap_server の configureWSDL メソッドを使用する必要があり、soap_server の register メソッドを呼び出して WEB サービス プログラムを登録するときに、より詳細なパラメータを指定するには、以下のコードのファイル名は「/nusoap/nusoap_server3.php」です。次に、ブラウザを開いて、作成したファイル http://127.0.0.1/nusoap/nusoap_server3.php にアクセスします。結果は次のようになります。サービスの WSDL。操作名をクリックして詳細を表示します。
require_once("lib/nusoap.php");
function concatenate($str1,$str2) {
if (is_string($str1) && is_string( $str2))
return $str1 . $str2;
else
return newsoap_fault('Client',",'連結関数のパラメータは 2 つの文字列である必要があります');
}
$soap = newsoap_server;
$soap->configureWSDL('concatenate'); // WSDL のサポートを初期化します
// サービスを登録します
$soap->register('concatenate ',
array("str1"=>"xsd:string","str2"=>>"xsd:string"), // 入力パラメータの定義
array("return"=>" xsd: string”) // 戻りパラメータの定義
);
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) : ”
$soap->service($HTTP_RAW_POST_DATA); ;
関数名 concatenate をクリックすると、関数の説明が表示されます。 「WSDL」をクリックするか、WEBサービスファイルにアクセスしてクエリ文字列「?wsdl」(http://127.0.0.1/nusoap/nusoap_server3.php?wsdl)を追加してWEBサービスのWSDLコンテンツを取得します。
2.4.2 WSDL を介した WEB サービスの呼び出し
WSDL を介した WEB サービスの呼び出しは、WSDL を使用せずに WEB サービスを呼び出すこととほぼ同じです。違いは、WSDL を介して WEB サービスを呼び出し、soapclient クラスを初期化するときに、2 つのパラメーターが soapclient のコンストラクターに渡されることです。最初のパラメーターは WSDL ファイルのアドレスであり、2 番目のパラメーターは WSDL を使用するかどうかを指定するだけです。それは真実です。以下のコードを見てください。コードのファイル名は「/nusoap/nusoap_client3.php」です。
コードをコピーしますコードは次のとおりです。 require_once("lib/nusoap.php");
$client = newsoapclient('http://127.0.0.1/nusoap/nusoap_server3.php?wsdl ',true);$parameters=array('String1','String2');
$str=$client->call('concatenate',$parameters); err=$ client->getError()) {
echo ” プログラムの戻り値:”,$str;
} else {
echo ” エラー:”,$err; ?>
2.4.3 プロキシの使用
NuSOAP は、リモート WEB サービスを呼び出すためのプロキシ メソッドを提供します。この方法では、クライアントプログラム内にリモートサービスのプロキシオブジェクトを作成し、soapclientクラスのcallメソッドを経由せずにプロキシ経由でリモートWEBサービスを直接呼び出します。以下のコードを見てください。
コードをコピー
コードは次のとおりです:
require_once("lib/nusoap.php) "); $client = newsoapclient('http://127.0.0.1/nusoap/nusoap_server3.php?wsdl',true); $proxy=$client -> getProxy(); //プロキシオブジェクトの作成(soap_proxyクラス)
$str=$proxy->concatenate(” Parameter 1″,” Parameter 2″) // WEBサービスを直接呼び出す if (!$err=$proxy- >getError( )) {echo ” プログラムが返します:”,$str;
} else {
echo ” エラー:”,$err;
? >