欢迎各位兄弟 发布技术文章
这里的技术是共享的
php 的SOAP扩展可以协助我们方便的调用别人公开的web服务,也可以让我们很容易就实现公开自己的服务。
本文以windows下安装的php为例,介绍如何使用SOAP。
1什么是SOAP
SOAP(Simple Object Access Protocol)简单对象访问协议是一种Web服务协议,通过这中协议我们可以构建soap客户端去访问别人公开的服务,也可以公开一个soap 服务端供别人访问。其工作原理是将对象转换成xml消息在客户端与服务端来回传递。服务端把对象的方法属性以及方法传什么参数转换成一个用xml描述的文件,客户端根据这个xml文件描述编写相应的调用代码,执行时调用代码会转换成xml消息发送到服务端,而到服务端又会把客户端发来的xml消息转换成对象执行相应的代码。这就是soap协议工作的原理。
2如何开启SOAP
windows下在php安装目录下的php.ini中找到extension=php_soap.dll项,去掉其前面的 ; 注释保存重启服务器即可。其还有一些配置,可在配置文件中设置,也可在php运行时设置
soap.wsdl_cache_enabled=1 设置是否缓存wsdl文件
soap.wsdl_cache_dir="/tmp" 设置缓存目录
soap.wsdl_cache_ttl=86400 设置缓存时间
soap.wsdl_cache_limit = 5 设置内存中缓存wsdl文件的个数
soap.wsdl_cache 设置缓存类型,
其取值范围 WSDL_CACHE_NONE (0) 不缓存
WSDL_CACHE_DISK (1) 缓存到硬盘
WSDL_CACHE_MEMORY (2) 缓存到内存
WSDL_CACHE_BOTH (3) 同时缓存到内存和硬盘
3使用soap客户端
soap客户端有如上图所示方法,其中有些已经废弃,有些只是在指定模式下才可以使用。
方法详解:
__call: 已废弃,使用__soapCall代替
__construct: SoapClient()的别名函数
SoapClient: 此函数用来创建一个SoapClient客户端,由于客户端有两种工作模式。所以传参也不一样。
(1).WSDL模式
此模式下也可以传需要的第二个参数的对应项
$client = new SoapClient('http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL');
1.
(2).non-WSDL模式
此模式下 location 和 uri 选项必须设置 location 是发送请求到SOAP server的地址 uri 是SOAP service的命名空间
$client = new SoapClient(null,array('location'=>'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx',
'uri'=>'http://WebXml.com.cn/'));
1.
2.
__getFunctions:此函数仅在 WSDL 模式下生效。返回wsdl文件中描述的web service提供的函数
$client = new SoapClient('http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL');
$funArr = $client->__getFunctions();
var_dump($funArr);
/*
输出:
array (size=10)
0 => string 'getSupportCityResponse getSupportCity(getSupportCity $parameters)' (length=65)
1 => string 'getSupportProvinceResponse getSupportProvince(getSupportProvince $parameters)' (length=77)
2 => string 'getSupportDataSetResponse getSupportDataSet(getSupportDataSet $parameters)' (length=74)
3 => string 'getWeatherbyCityNameResponse getWeatherbyCityName(getWeatherbyCityName $parameters)' (length=83)
4 => string 'getWeatherbyCityNameProResponse getWeatherbyCityNamePro(getWeatherbyCityNamePro $parameters)' (length=92)
5 => string 'getSupportCityResponse getSupportCity(getSupportCity $parameters)' (length=65)
6 => string 'getSupportProvinceResponse getSupportProvince(getSupportProvince $parameters)' (length=77)
7 => string 'getSupportDataSetResponse getSupportDataSet(getSupportDataSet $parameters)' (length=74)
8 => string 'getWeatherbyCityNameResponse getWeatherbyCityName(getWeatherbyCityName $parameters)' (length=83)
9 => string 'getWeatherbyCityNameProResponse getWeatherbyCityNamePro(getWeatherbyCityNamePro $parameters)' (length=92)
*/
__getLastRequest: 此方法只有在创建SoapClient对象的时候设置 trace 选项为 TRUE 的时候可用,返回最后一次soap请求时发送的xml消息
__getLastRequestHeaders: 此方法只有在创建SoapClient对象的时候设置 trace 选项为 TRUE 的时候可用,返回最后一次soap请求时的header
__getLastResponse: 此方法只有在创建SoapClient对象的时候设置 trace 选项为 TRUE 的时候可用,返回最后一次soap请求时的响应
__getLastResponseHeaders: 用法同上
__getTypes : 此函数仅在 WSDL 模式下生效。返回的数组详细介绍了web service 所有的结构和类型
__setCookie :设置一个cookie随请求发送
__setLocation: 调用此方法相当于在new SoapClient对象时指定了 location 选项
__setSoapHeaders:设置请求headers
__soapCall: 主要用于no-WSDL模式下调用web services 方法。
当然WSDL模式下也可以用。只不过WSDL模式下有更简单的方法。例如:
<?php
$client = new SoapClient('http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL');
$arr = array('byProvinceName'=>'');
$return = $client->getSupportCity($arr);
echo '<pre>';
print_r($return);
/*
以上代码输出类似于:
stdClass Object
(
[getSupportCityResult] => stdClass Object
(
[string] => Array
(
[0] => 北京 (54511)
[1] => 上海 (58367)
[2] => 天津 (54517)
[3] => 重庆 (57516)
[4] => 香港 (45005)......
*/
返回的stdClass的对象实例,我们可以直接当对象调用其属性那样调用($return->getSupportCityResult->string),也可以转成数组使用((array $return))
no-WSDL模式下调用按照手册上的方法始终没有调用成功,待以后研究出来再完善。
4构建soap服务端
SoapServer::addFunction — 添加一个或多个函数来处理SOAP请求
SoapServer::addSoapHeader — Add a SOAP header to the response
SoapServer::__construct — SoapServer constructor
SoapServer::fault — Issue SoapServer fault indicating an error
SoapServer::getFunctions — Returns list of defined functions
SoapServer::handle — Handles a SOAP request
SoapServer::setClass — Sets the class which handles SOAP requests
SoapServer::setObject — Sets the object which will be used to handle SOAP requests
SoapServer::setPersistence — Sets SoapServer persistence mode
SoapServer::SoapServer — SoapServer constructor
php soap提供web services
soap客户端有两种模式,wsdl模式和non-wsdl模式,那么服务端也一定有对应的两种模式。
non-wsdl模式:
<?php
class SoapServerHandler{
public function show(){
return 'class show';
}
public function sum($a,$b){
return $a+$b;
}
}
function show(){
return 'function show';
}
function sum($a,$b){
return $a+$b;
}
$server = new SoapServer(
null,
array(
'uri' =>'http://soap/',
'location'=>'http://localhost:8080/soapServer.php'
)
);
// 第一种方式
//$server->setClass('SoapServerHandler');
//$server->handle();
// 第二种方式
//$server->addFunction('show');
//$server->addFunction('sum');
//$server->handle();
// 第三种方式
$SoapServerHandlerObj = new SoapServerHandler();
$server->setObject($SoapServerHandlerObj);
$server->handle();
调用:
$client = new SoapClient(null,
array(
'location'=>'http://127.0.0.1:8080/soapServer.php',
'uri'=>'http://soap/',
));
//echo $client->show();
//echo $client->sum(1,2);
echo $client->__soapCall('show',array());
exit;
wsdl模式:
可用SoapDiscovery生成wsdl文件。
不过这也是一个过时的协议了,也不深究其细节了,这几天是跟一个20年前的系统进行对接,又用到这个协议,才回过头来复习一下。
下面的网址给出了一些可以测试的web services
-----------------------------------
©著作权归作者所有:来自51CTO博客作者梧桐深院的原创作品,请联系作者获取转载授权,否则将追究法律责任
php SOAP webservice
https://blog.51cto.com/u_7859800/5662542
来自 https://blog.51cto.com/u_7859800/5662542