就可以通过日志来查看调试信息。加入以下的代码将会显示冗长的调试信息。不幸的是输出的说明必须留给读者。
// Display the debug messages echo ''<h2>Debug</h2>''; echo ''<pre>'' . htmlspecialchars($client->debug_str, ENT_QUOTES) . ''</pre>'';
服务器端能够提供相似的调试信息,有趣的是,这些调试信息是在SOAP 的相应的末尾以 xml 格式显示,因此它可以在客户端中查看到。服务器端的调试看起来像这样:
<?php // Pull in the NuSOAP code require_once(''nusoap.php''); // Enable debugging *before* creating server instance $debug = 1; // 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); ?>
调试的第三个方法不算是真正的调试,它是很好的编程实践。上面的实例在调用 SOAP 的时候没有做错误的检查,更健壮的客户端会像这样:
<?php // Pull in the NuSOAP code require_once(''nusoap.php''); // Create the client instance $client = new soapclient(''http://localhost/phphack/helloworld.php''); // Check for an error $err = $client->getError(); if ($err) { // Display the error echo ''<p><b>Constructor error: '' . $err . ''</b></p>''; // At this point, you know the call that follows will fail } // Call the SOAP method $result = $client->call(''hello'', array(''name'' => ''Scott'')); // Check for a fault if ($client->fault) { echo ''<p><b>Fault: ''; print_r($result); echo ''</b></p>''; } else { // Check for errors $err = $client->getError(); if ($err) { // Display the error echo ''<p><b>Error: '' . $err . ''</b></p>''; } else { // Display the result print_r($result); } } ?>
为了测试代码,需要引起错误发生,例如,改变调用的方法名称 hello 为 goodbye。
Request and Response 我在上面的例子中已经展示了显示 SOAP 的请求和响应信息是如此的容易,在这里 hello2client.php 的请求信息:
POST /phphack/helloworld2.php HTTP/1.0 Host: localhost User-Agent: NuSOAP/0.6.8 (1.81) Content-Type: text/xml; charset=ISO-8859-1 SOAPAction: "" Content-Length: 538
<?xml version="1.0" encoding="ISO-8859-1"?> <SOAP-ENV:Envelope 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 |