欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

php SOAP webservice 有大用

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


普通分类: