このドキュメントでは、NuSOAP の入手方法とインストール方法について説明し、NuSOAP の機能を説明するための例をいくつか示します。これは NuSOAP の包括的な入門書ではありませんが、PHP 開発者の参考になれば幸いです。
NuSOAP は、開発者が SOAP Web サービスを作成して使用できるようにする PHP クラスのセットです。 PHP 拡張機能をインストールする必要はありません。 2004 年 12 月 3 日に開発され、現在のバージョンは NuSOAP (0.6.7) です。 SOAP 1.1 仕様をサポートしているため、WSDL 1.1 を生成および使用でき、rpc/encoded および document/literal サービスもサポートしています。ただし、NuSOAP は .NET や Apache Axis のような完全な実装を提供していないことに注意することが重要です。
こんにちは世界
「Hello, World」の例から始めて、基本的な NuSOAP クライアントとサーバーのコードを作成します。
まずサーバー側から始めましょう。サーバー側がなければ、クライアント側があっても意味がないからです。単一のパラメータを受け取り文字列を返す Hello という名前の SOAP メソッドを作成します。コード内のコメントが役立つ指示を提供することを願っています。
<?php
// NuSOAP コードを取り込みます
require_once('nusoap.php');
// サーバーインスタンスを作成します
$server = 新しいsoap_server;
// 公開するメソッドを登録します
$server->register('hello');
// メソッドを PHP 関数として定義します
関数 hello($name) {
'こんにちは、' を返します。
}
// リクエストを使用してサービスを呼び出す(試みる)
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) $HTTP_RAW_POST_DATA : '';
$サーバー->サービス($HTTP_RAW_POST_DATA);
?>
次に、クライアント コードを示します。注意すべき重要な点がいくつかあります。まず、インスタンス soapclient を作成するときに、サービス URL をパラメータとして指定する必要があります。この例では、 http://から helloworld.php にアクセスします。 localhost/phphackの。もちろん、使用したいサービスは別の URL に配置されます。次に、サービスを呼び出すとき、最初のパラメータはサービスの名前であり、有効なメソッド名と一致する必要があります (一部のサーバーでは大文字と小文字が区別されます)。この例では、helloworld.php にすでに登録されているメソッドと一致する必要があります。最後に、2 番目のパラメーターは、SOAP サービス メソッドにパラメーターとして渡される配列です。 helloworld.php の hello メソッドにはパラメーターが 1 つしかないため、配列の要素は 1 つだけです。
<?php
// NuSOAP コードを取り込みます
require_once('nusoap.php');
// クライアントインスタンスを作成する
$client = 新しいsoapclient('http://localhost/phphack/helloworld.php');
// SOAPメソッドを呼び出す
$result = $client->call('hello', array('name' => 'Scott'));
// 結果を表示する
print_r($result);
?>
デバッグ
プログラミングをしていると、何か問題が発生するたびにデバッグが必要になります。 NuSOAP は、これを行うのに役立つ一連のツールを提供します。 NuSOAP のデバッグ時に確認する必要がある情報は、送信されたリクエスト情報と、それに対応して返された情報です。 NuSOAP のクライアント クラスを使用すると、その 2 つのメンバーを通じてこの情報を表示できます。たとえば、ここではリクエストとレスポンスを示す helloworldclient.php の修正バージョンを示します。次のセクションでは、クライアント コードに表示されるリクエストとレスポンスの情報を確認します。
<?php
// NuSOAP コードを取り込みます
require_once('nusoap.php');
// クライアントインスタンスを作成する
$client = 新しいsoapclient('http://localhost/phphack/helloworld.php');
// SOAPメソッドを呼び出す
$result = $client->call('hello', array('name' => 'Scott'));
// 結果を表示する
print_r($result);
// リクエストとレスポンスを表示する
echo '<h2>リクエスト</h2>';
echo '<pre>' .htmlspecialchars($client->request, ENT_QUOTES) '</pre>';
echo '<h2>応答</h2>';
echo '<pre>' .htmlspecialchars($client->response, ENT_QUOTES) '</pre>';
?>
NuSOAP は、クラスを使用してログを通じてデバッグ情報を表示するメソッドも提供します。次のコードを追加すると、長いデバッグ情報が表示されます。残念ながら、出力の説明は読者に委ねる必要があります。
// デバッグメッセージを表示します
echo '<h2>デバッグ</h2>';
echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) '</pre>';
興味深いことに、これらのデバッグ情報は、対応する SOAP 形式の末尾にあります。クライアントで表示できるように表示されます。サーバー側のデバッグは次のようになります:
<?php
// NuSOAP コードを取り込みます
require_once('nusoap.php');
// サーバー インスタンスを作成する *前* のデバッグを有効にする
$デバッグ = 1;
// サーバーインスタンスを作成します
$server = 新しいsoap_server;
// 公開するメソッドを登録します
$server->register('hello');
// メソッドを PHP 関数として定義します
関数 hello($name) {
'こんにちは、' を返します。
}
// リクエストを使用してサービスを呼び出す(試みる)
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) $HTTP_RAW_POST_DATA : '';
$サーバー->サービス($HTTP_RAW_POST_DATA);
?>
3 番目のデバッグ方法は実際のデバッグではなく、良いプログラミングの練習です。上記の例では、SOAP を呼び出すときにエラー チェックを行いません。より堅牢なクライアントは次のようになります
。
// NuSOAP コードを取り込みます
require_once('nusoap.php');
// クライアントインスタンスを作成する
$client = 新しいsoapclient('http://localhost/phphack/helloworld.php');
// エラーをチェックする
$err = $client->getError();
if ($err) {
// エラーを表示する
echo '<p><b>コンストラクター エラー: ' . $err ';
// この時点で、後続の呼び出しが失敗することがわかります。
}
// SOAPメソッドを呼び出す
$result = $client->call('hello', array('name' => 'Scott'));
// 障害がないかチェックする
if ($client->fault) {
echo '<p><b>エラー: ';
print_r($result);
エコー '</b></p>';
} それ以外 {
// エラーをチェックする
$err = $client->getError();
if ($err) {
// エラーを表示する
echo '<p><b>エラー: ' . $err ';
} それ以外 {
// 結果を表示する
print_r($result);
}
}
?>
コードをテストするには、呼び出されるメソッド名 hello を Goodbye に変更するなど、エラーを発生させる必要があります。
リクエストとレスポンス
上の例では、SOAP リクエストとレスポンスの情報を表示するのがいかに簡単かを示しました。hello2client.php のリクエスト情報は次のとおりです。
POST /phphack/helloworld2.php HTTP/1.0
ホスト: ローカルホスト
ユーザーエージェント: NuSOAP/0.6.8 (1.81)
コンテンツタイプ: text/xml; 文字セット=ISO-8859-1
SOAPアクション: ""
Content-Length: 538
<?xml version="1.0" encoding="ISO-8859-1"?>
<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 ">
<SOAP-ENV:本体>
<ns1:hello xmlns:ns1=" http://testuri.org ">
<name xsi:type="xsd:string">スコット</name>
</ns1:こんにちは>
</SOAP-ENV:本体>
</SOAP-ENV:エンベロープ>
HTTP ヘッダーでは、SOAPAction が空の文字列であり、これがデフォルト値であることがわかります。サービス メソッドで SOAPAction の値を設定し、クライアント コードで SOAPAction をパラメータとして指定してメソッドを呼び出すことができます。
XML ペイロードでは、NuSOAP が既知の ISO-8859-1 エンコーディングを Latin-1 として使用していることがわかります。別のエンコーディングを指定するには、クライアントのsoapclient インスタンスにsoap_defencoding 属性を設定します。もちろん、指定されたエンコーディングを使用してパラメータ データをエンコードするのはプログラマの責任です。幸いなことに、PHP には、UTF-8 など、SOAP で最も一般的なエンコード データをエンコードおよびデコードするための関数が多数用意されています。
もう 1 つの注意点は、この要素が呼び出されるメソッドを指定していることです。hello という名前の要素は、実際のドメイン名を指定することがベスト プラクティスであり、多くのサービスで非常に一般的です。 。 これは必要である。将来のドキュメントはここに示されています:
SOAP サービスは次のように応答します:
HTTP/1.1 200 OK
サーバー: Microsoft-IIS/5.0
日付: 2004 年 11 月 3 日水曜日 21:32:34 GMT
X パワードバイ: ASP.NET
X-Powered-By: PHP/4.3.4
サーバー: NuSOAP サーバー v0.6.8
X-SOAPサーバー: NuSOAP/0.6.8 (1.81)
コンテンツタイプ: text/xml; 文字セット=ISO-8859-1
Content-Length: 556
<?xml version="1.0"coding="ISO-8859-1"?>
<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 ">
<SOAP-ENV:本体>
<ns1:helloResponse xmlns:ns1=" http://tempuri.org ">
<return xsi:type="xsd:string">こんにちは、スコット</return>
</helloResponse>
</SOAP-ENV:本体>
</SOAP-ENV:エンベロープ>