Home >Backend Development >PHP Tutorial >NuSOAP Tutorial_PHP Tutorial
这个文档描述了如何取得和安装 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 格式显示,因此它可以在客户端中查看到。服务器端的调试看起来像这样:
// 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);
?>
The third method of debugging is not really debugging, it is good programming practice. The above example does not do error checking when calling SOAP. A more robust client would look like this:
// 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
Constructor error: . $err .
;Fault: ;
print_r($result);
echo
< ;b>Error: . $err .
;In order to test the code, you need to cause an error to occur, for example, change the called method name hello to goodbye.
Request and Response
I have shown how easy it is to display SOAP request and response information in the example above, here is the request information for 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
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">
In the HTTP headers, you will see that SOAPAction is an empty string, which is its default value. Your service method can set the value of the SOAPAction, and your client code can call the method specifying the SOAPAction as a parameter.
In the XML payload, you can see that NuSOAP uses ISO-8859-1, which is as well-known as Latin-1, as the encoding. To specify a different encoding, you can set the soap_defencoding attribute on the client soapclient instance. It is of course the programmer's responsibility to encode parameter data using the specified encoding. Fortunately, PHP provides many functions to encode and decode the most common encoding data in SOAP, such as UTF-8.
Another thing to note is that the element specifies the method to be called. The element named hello is placed under the domain name of http://tempuri.org. It is best practice to specify the real domain name. , it is also necessary for many services. A future document is shown here:
The response from the SOAP service looks like this:
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Wed, 03 Nov 2004 21:32:34 GMT
X-Powere