这个文档描述了如何取得和安装 NuSOAP,然后提供一些实例来说明 NuSOAP 的功能,这并不是一个全面的 NuSOAP 的介绍,但是希望能够然一些 PHP 开发者可以有一个很好的入门。 NuSOAP 是一组 PHP 类,它让开发者可以创建和使用 SOAP web services。它不需要安装任何的 PHP 扩展。它是在2004年12月3日被开发,当前的版本是 NuSOAP(0.6.7) 。支持 SOAP 1.1 规范,它能够生产 WSDL 1.1 ,当然也可以使用它,同时也支持 rpc/encoded and document/literal service。但是,必须注意 NuSOAP 没有像 .NET 和 Apache Axis 那样提供完全的实现。 Hello, World 我们先从服务器端开始,应为没有服务器端,有客户端也是没有意义的。我们将编写一个带有单个参数并返回一个字符串,名叫 Hello 的 SOAP 方法,希望代码中的注释能够提供有效的说明。 // Pull in the NuSOAP code 以下是客户端的代码,有一些重要的事情需要注意:首先,当创建实例 soapclient 时,需要指定一个 service 的 URL 为参数,在这个实例中,helloworld.php 从 http://localhost/phphack 访问的。当然,你要使用的 services 放在不同的 URL;第二,当调用service 时,第一个参数是 service 的名字,必须要匹配有效的方法名(有的服务器是大小写敏感的)。在这个实例,他必须匹配在 helloworld.php 中已经注册了的方法。最后,第二个参数是一个数组,它将是传递给 SOAP service 方法作为参数。既然 helloworld.php 中的方法 hello 只有一个参数,那么数组就只有一个元素。 // Pull in the NuSOAP code Debugging // Pull in the NuSOAP code
我会以 "Hello, World" 为实例做开始,编写基本的 NuSOAP 客户端和服务器端的代码。
require_once(nusoap.php);
// Create the server instance
$server = new soap_server;
// Register the method to expose
$server->register(hello);
// Define the method as a PHP function
function hello($name) {
return Hello, . $name;
}
// Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ;
$server->service($HTTP_RAW_POST_DATA);
?>
require_once(nusoap.php);
// Create the client instance
$client = new soapclient(http://localhost/phphack/helloworld.php);
// Call the SOAP method
$result = $client->call(hello, array(name => Scott));
// Display the result
print_r($result);
?>
编程时,当有问题出现的时候你都需要调试。NuSOAP 提供了一组工具来帮助你做这个工作。NuSOAP 调试的时候需要查看的信息是发送的请求信息和返回的相应信息。NuSOAP 的客户端类允许你通过它的两个成员来查看这些信息。例如,这里是显示请求和响应的 helloworldclient.php 的修改版。在下一部分我会回顾显示在客户端代码的请求和响应信息。
require_once(nusoap.php);
// Create the client instance
$client = new soapclient(http://localhost/phphack/helloworld.php);
// Call the SOAP method
$result = $client->call(hello, array(name => Scott));
// Display the result
print_r($result);
// Display the request and response
echo Request
;
echo . htmlspecialchars($client->request, ENT_QUOTES) .
;
echo Response
;
echo . htmlspecialchars($client->response, ENT_QUOTES) .
;
?>
NuSOAP 也提供了一个方法使用它的类就可以通过日志来查看调试信息。加入以下的代码将会显示冗长的调试信息。不幸的是输出的说明必须留给读者。
// Display the debug messages
echo
. htmlspecialchars($client->debug_str, ENT_QUOTES) .;
服务器端能够提供相似的调试信息,有趣的是,这些调试信息是在SOAP 的相应的末尾以 xml 格式显示,因此它可以在客户端中查看到。服务器端的调试看起来像这样:
// NuSOAP コードを取り込みます
require_once(nusoap.php);
// サーバー インスタンスを作成する *前* デバッグを有効にします
$debug = 1;
// サーバー インスタンスを作成します
$server = new soap_server;
// 公開するメソッドを登録します
$server->register(hello);
// メソッドを PHP 関数として定義します
function hello($name) {
Return $name;
}
// リクエストを使用してサービスを呼び出します
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ;
$server->service($HTTP_RAW_POST_DATA);
?>
3 番目のデバッグ方法は実際のデバッグではなく、良いプログラミングの練習です。上記の例では、SOAP を呼び出すときにエラー チェックを行いません。より堅牢なクライアントは次のようになります。
// NuSOAP コードを取り込みますコンストラクタエラー: . /b>
;Fault: ;
print_r($result);
echo ;
} else {
// エラーをチェック
$err = $client->getError();
if ($err) {
// エラーを表示
echo
< ;b>エラー: . $err .
;ユーザーエージェント: NuSOAP/0.6.8 (1.81)
Content-Type: text/xml; charset=ISO-8859-1SOAPAction: ""
コンテンツの長さ: 538
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:si="http:/ /soapinterop.org/xsd">
HTTP ヘッダーでは、SOAPAction が空の文字列。これはデフォルト値です。サービス メソッドで SOAPAction の値を設定し、クライアント コードで SOAPAction をパラメータとして指定してメソッドを呼び出すことができます。
XML ペイロードでは、NuSOAP が Latin-1 としてよく知られている ISO-8859-1 をエンコーディングとして使用していることがわかります。別のエンコーディングを指定するには、クライアントのsoapclient インスタンスにsoap_defencoding 属性を設定します。もちろん、指定されたエンコーディングを使用してパラメータ データをエンコードするのはプログラマの責任です。幸いなことに、PHP には、UTF-8 など、SOAP で最も一般的なエンコード データをエンコードおよびデコードするための関数が多数用意されています。
もう 1 つの注意点は、hello という名前の要素が http://tempuri.org のドメイン名の下に配置されることです。多くのサービスでは、実際のドメイン名を指定するのがベスト プラクティスです。も非常に必要です。将来のドキュメントはここに示されています:
SOAP サービスの応答は次のようになります:
サーバー: Microsoft-IIS/5.0
日付: Wed, 03 Nov 2004 21:32:34 GMTX-Powere