可以根据wsdl文件生成客户端,或者直接根据地址调用。直接调用的话,主要有AXIS和SOAP两种方法
- 我们可以调用哪些操作,这些操作需要的参数是什么?
- 参数的数据类型定义是什么?
要搞清楚这两点,我们当然可以去直接阅读 WSDL 文件,但由于 WSDL 文件可能会很复杂,所以有的时候要弄清楚这些问题可能会花费不少的时间;另外,有些时候我们还没有办法得到 WSDL 文件。当然还存在其他方法,SoapClient 类中提供了两个很有用的成员函数可以让我们轻松获得 Web 服务中提供的操作,以及相关的数据结构定义:
查看 Web 服务开放的方法和数据类型
print_r( $client->__getFunctions() );
print_r( $client->__getTypes() );
通过这两行代码,我们可以看到浏览器显示的结果:
Web 服务开放的方法和数据类型示例
Array
(
[0] => ProductSpec QuerySpec(ProductQueryCode $QueryCode)
)
Array
(
[0] => struct ProductQueryCode {
string ProductCode;
}
[1] => struct ProductSpec {
string ProductCode;
string CPU;
string RAM;
string Screen;
string HDD;
}
)
于是我们可以知道,我们可以调用 Web 服务中的 QuerySpec 操作,并且得知了这个操作的输入和输出数据的定义。这个时候我们就可以着手编写调用 QuerySpec 的代码了。下面两个语句都可以完成调用的功能,它们的作用是等效的:
调用 Web 服务开放的操作
$result = $client->__soapCall('QuerySpec', array( array( "ProductCode" => '1175-PXA') ) );
$result = $client->QuerySpec( array( array( "ProductCode" => '1175-PXA') ) );
可以直接使用 Web 服务中的操作名称作为函数进行调用,就像真的在调用本地定义的函数一样,这种方法比较直观;也可以把操作名称作为参数传给 SoapClient::__soapCall(),效果是一样的。
需要注意的依然是参数的结构。和服务端一样,输入的参数依然需要组织成数组的形式,但是有一点点不同,已定义好的数组又被放入了最外层的数组中。看起来最外面的一层包装似乎有些多余,但是如果去掉,程序是不会得到正确结果的。
最后我们需要使用 Web 服务端返回的结果。与前面提到的类似,服务端返回的数据也是以对象嵌套的方式组织的,所以我们只需要用成员引用操作符 (->) 即可获得相应域的值:
使用 SOAP 应答中的数据
echo "Product Code:" . $client->ProductCode . "<br />";
echo "Product Code:" . $client->CPU . "<br />";
echo "Product Code:" . $client->RAM . "<br />";
echo "Product Code:" . $client->Screen . "<br />";
echo "Product Code:" . $client->HDD . "<br />";
稍加修改,我们就可以得到之前给出的在浏览器中的显示效果了。
到这里我们的工作似乎已经结束了。但是实际的开发过程是不可能如此顺利的,如果我们的代码没有得到正确的结果怎么办?所以,我们需要了解一些使用 PHP 开发 SOAP 应用程序时的用到的调试知识。
本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/925192,如需转载请自行联系原作者