php SOAP webservice

    xiaoxiao2023-03-24  6

    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');

    (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/')); __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

    <?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;

    下面的网址给出了一些可以测试的web services

    https://my.oschina.net/CraneHe/blog/183471

    转载请注明原文地址: https://ju.6miu.com/read-1201373.html
    最新回复(0)