SOAP webservice接口

PHP 中,在 php.ini 文件中开启了 php_soap.dll 扩展后,就可以支持 SOAP 了。
在soap扩展库中,主要包括三种对象。
1、SoapServer
    用于创建php服务器端页面时定义可被调用的函数及返回响应数据。创建一个SoapServer对象的语法格式如下:
    $soap = new SoapServer($wsdl, $array);
    其中,$wsdl为shoap使用得wsdl文件,wsdl 是描述 Web Service的一种标准格式,若将$wsdl设置为null,则表示不使用wsdl模式。$array是SoapServer的属性信息,是一个数组。
    SoapServer对象的addFunction方法是用来声明哪个函数可以被客户端调用,语法格式如下:
    $soap->addFunction($function_name);
    其中,$soap是一个SoapServer对象,$function_name是需要被调用的函数名。
    SoapServer对象的handle方法用来处理用户输入并调用相应的函数,最后返回给客户端处理的结果。语法格式如下:
    $soap->handle([$soap_request]);
    其中,$soap是一个SoapServer对象,$soap_request是一个可选参数,用来表示用户的请求信息。如果不指定$soap_request,则表示服务器将接收用户的全部请求。
2、SoapCliet
    用于调用远程服务器上的SoapServer页面,并实现了对相应函数的调用。创建一个SoapClient对象的语法格式如下:
    $soap = new SoapClient($wsdl,$array);
    其中,参数$wsdl和$array与SoapServer相同。
    创建SoapClient对象后,调用服务端页面中的函数相当于调用了SoapClient的方法,创建语法如下:
    $soap->user_function($params);
    其中,$soap是一个SoapClient对象,user_function是服务器端要调用的函数,$params 是要传入函数的参数。
3、SoapFault
    SoapFault用于生成soap访问过程中可能出现的错误。创建一个soapFault对象的语法格式如下:
    $fault = new SoapFault($faultcode,$faultstring);
    其中,$faultcode是用户定义的错误代码,$faultstring是用户自定义的错误信息。soapFault 对象会在服务器端页面出现错误时自动生成,或者通过用户自行创建SoapFault对象时生成。对于 Soap访问时出现的错误,客户端可通过捕捉SoapFalut对象来获得相应的错误信息。
    在客户端捕获SoapFault对象后,可以通过下面的代码获得错误代码和错误信息:
    $fault->faultcode;//错误代码
    $fault->faultstring;//错误信息
    其中,$fault是在前面创建的SoapFault对象。
不论是SoapServer还是SoapClient,都接收两个参数,其中第二个参数是Option,它支持若干选项,这里我们用到的有:
uri:命名空间,客户端和服务端需要使用相同的命名空间
location:客户端用,用来指定服务端程序的访问地址,也就是本例第二段代码的程序地址。
trace:客户端用,为true时可以获取服务端和客户端通信的内容,以供调试。

Soapserver.php

Java代码  

  1. <?php  
  2. //先创建一个SoapServer对象实例,然后将我们要暴露的函数注册,  
  3. //最后的handle()用来处理接受的soap请求  
  4. error_reporting(7); //正式发布时,设为 0  
  5. date_default_timezone_set('PRC'); //设置时区  
  6. /* 几个供client端调用的函数 */  
  7. function reverse($str)  
  8. {  
  9.     $retval = '';  
  10.     if (strlen($str) < 1) {  
  11.         return new SoapFault ('Client', '', 'Invalid string');  
  12.     }  
  13.     for ($i = 1; $i <= strlen($str); $i++) {  
  14.         $retval .= $str [(strlen($str) - $i)];  
  15.     }  
  16.     return $retval;  
  17. }  
  18.   
  19. function add2numbers($num1, $num2)  
  20. {  
  21.     if (trim($num1) != intval($num1)) {  
  22.         return new SoapFault ('Client', '', 'The first number is invalid');  
  23.     }  
  24.     if (trim($num2) != intval($num2)) {  
  25.         return new SoapFault ('Client', '', 'The second number is invalid');  
  26.     }  
  27.     return ($num1 + $num2);  
  28. }  
  29.   
  30. function gettime()  
  31. {  
  32.     $time = date('Y-m-d H:i:s', time());  
  33.     return $time;  
  34. }  
  35.   
  36. $soap = new SoapServer (null, array('uri' => "httr://test-rui"));  
  37. $soap->addFunction('reverse');  
  38. $soap->addFunction('add2numbers');  
  39. $soap->addFunction('gettime');  
  40. $soap->addFunction(SOAP_FUNCTIONS_ALL);  
  41. $soap->handle();  
  42. ?>  

 SoapClient.php

Java代码  

  1. <?php  
  2. error_reporting(7);  
  3. try {  
  4.     $client = new SoapClient (null, array('location' => "http://www.yiigo.com/Soapserver.php", 'uri' => "http://test-uri"));  
  5.   
  6.     $str = "This string will be reversed";  
  7.     $reversed = $client->reverse($str);  
  8.     echo "if you reverse '$str', you will get '$reversed'";  
  9.   
  10.     $n1 = 20;  
  11.     $n2 = 33;  
  12.     $sum = $client->add2numbers($n1, $n2);  
  13.     echo "<br>";  
  14.     echo "if you try $n1 + $n2, you will get $sum";  
  15.   
  16.     echo "<br>";  
  17.     echo "The remoye system time is: " . $client->gettime();  
  18. } catch (SoapFault $fault) {  
  19.     echo "Fault! code:" . $fault->faultcode . " string:" . $fault->faultstring;  
  20. }  
  21. ?>  

if you reverse 'This string will be reversed', you will get 'desrever eb lliw gnirts sihT'
if you try 20 + 33, you will get 53
The remoye system time is: 2012-05-28 16:14:29

 

通过SoapHeader实现身份认证

Java代码  

  1. <?php  
  2. class Server  
  3. {  
  4.     public function auth($a)  
  5.     {  
  6.         if ($a != '123456789') {  
  7.             throw new SoapFault('Server', '用户身份认证信息错误');  
  8.         }  
  9.     }  
  10.   
  11.     public function say()  
  12.     {  
  13.         return 'Hi';  
  14.     }  
  15. }  
  16.   
  17. $srv = new SoapServer(null, array('uri' => 'http://localhost/namespace'));  
  18. $srv->setClass('Server');  
  19. $srv->handle();   

 客户端

Java代码  

  1. <?php  
  2. $cli = new SoapClient(null,  
  3.     array('uri' => 'http://localhost/namespace/',  
  4.         'location' => 'http://localhost/server.php',  
  5.         'trace' => true));  
  6.   
  7. //auth为服务端要处理的函数  12345689为参数    
  8. $h = new SoapHeader('http://localhost/namespace/',  
  9.     'auth', '123456789', false, SOAP_ACTOR_NEXT);  
  10. $cli->__setSoapHeaders(array($h));  
  11. try {  
  12.     echo $cli->say();  
  13. } catch (Exception $e) {  
  14.     echo $e->getMessage();  
  15. }   

注意观察server.php中的server类有一个方法“auth”,刚好与header的名称对应,方法auth的参数$u,就是soapHeader的data,soapServer接收到这个请求会,先调用auth方法,并把“123456789”作为参数传递给该方法。mustUnderstand参数为false时,即便没有auth这个方法,say方法也会被调用,但是如果它为true的话,如果auth方法不存在,就会返回一个Soapfault告知该header没有被处理。actor参数指名那些role必须处理该header,这儿我理解得不是太透彻,不好说。

Java代码  

  1. $file = $this->getSoapWSDL();  
  2. $client = new SoapClient($file);//url可以通过浏览器访问,不能直接调用解决  
  3. $param = array('userID' => 'test', 'merchantID' => 'test');  
  4. $returnSt = $client->checkUser($param);  
  5. print_r($returnSt->checkUserResult);  
  6.   
  7. public function getSoapWSDL()  
  8. { //定期将url的文件保存到本地  
  9.     $file = Mage::getBaseDir() . DS . 'data' . DS . 'shengda' . DS . 'export.wsdl';  
  10.     if (time() > filemtime($file) + 7 * 86400) {  
  11.         $url = "http://jf.sdo.com/ExchangeScore/ExchangeService.asmx?WSDL";  
  12.         include_once(BP . DS . "lib/Snoopy.class.php");  
  13.         $snoopy = new Snoopy;  
  14.         $snoopy->fetch($url); //获取所有内容  
  15.         $snoopy->read_timeout = 4;  
  16.         $wsdl = $snoopy->results;  
  17.         if ($snoopy->status == '200' && !$snoopy->timed_out) {  
  18.             if (!is_dir(dirname($file))) {  
  19.                 mkdir(dirname($file));  
  20.             }  
  21.             file_put_contents($file, $wsdl);  
  22.         }  
  23.     }  
  24.     return $file;  
  25. }  

 

时间: 2024-10-03 04:19:12

SOAP webservice接口的相关文章

php中创建和调用webservice接口示例

  这篇文章主要介绍了php中创建和调用webservice接口示例,包括webservice基本知识.webservice服务端例子.webservice客户端例子,需要的朋友可以参考下 作为开发者来讲,要想写webservice接口或者调用别人的webservice接口,首先需要了解什么是webservice.简单说, WebService就是一些站点开放一些服务出来, 也可以是你自己开发的Service, 也就是一些方法, 通过URL,指定某一个方法名,发出请求,站点里的这个服务(方法),

wsdl-关于webservice 接口对接 求大神解决 在线等

问题描述 关于webservice 接口对接 求大神解决 在线等 最近正在调试接口 关于移动.联通SI应用的,对接文档这边 我用的axis2 插件直接生成wsdl 发布webservice 调用 都是OK. 但是在与联通对接的时候 出现了问题. 告知是调用soap错误. 这个错误的原因是根据wsdl调用接口的时候产生了错误. 联通和移动的webservice规范都是按照华为来的. 所以我想知道 关于华为的webservice接口对接 需要使用什么技术 才能通过规范? 下面我截图两张 是2个wsd

调用服务端的webservice接口异常,axis2,求大神解答,,拜托,拜托,感谢~~~

问题描述 调用服务端的webservice接口异常,axis2,求大神解答,,拜托,拜托,感谢~~~ 异常信息如下:Exception in thread ""main"" AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server faultSubcode: faultString: org.apache.axis2.databinding.ADBException: Unexpec

java调用webservice接口发送xml报文

问题描述 java调用webservice接口发送xml报文 1.webservice接口是axis1发布的 2.请求报文格式如下 <?xml version="1.0" encoding="gbk"?><SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XM

web service-如何写webservice接口

问题描述 如何写webservice接口 长得像这个样子的 http://soap.sfwl.net:8056/TransportService.asmx?op=Get_OrderInOuts 请问这样的ws接口是用什么工具写得 还有大概的步骤. 谢谢 解决方案 接口文档要如何写公共开放WebService接口常用的webservice接口 解决方案二: 补充下.是如何写这样的接口服务端. 解决方案三: 服务端 按照逻辑写好就行,记得发布. 你可以发布在tomcat里,在新建一个项目访问一下,成

soap-C++调用webservice接口出错,具体如图所示,请大神帮忙~~

问题描述 C++调用webservice接口出错,具体如图所示,请大神帮忙~~ 我已经安装了soap toolkit 3.0 不知道为什么还不行~ 报错如下: ------ 已启动生成: 项目: myclient, 配置: Debug Win32 ------ 1>生成启动时间为 2016/1/6 19:01:21. 1>InitializeBuildStatus: 1> 正在对"Debugmyclient.unsuccessfulbuild"执行 Touch 任务.

请求-可不可以利用URL路径去访问webservice接口呢?

问题描述 可不可以利用URL路径去访问webservice接口呢? 我想在手机端利用URL访问服务器上的java程序里的webservice接口,应该怎么做呢?请求大神指点.. 解决方案 手机端是什么语言写的. 基于soap ,http 都可以实现你的需求. 解决方案二: 可以使用restful service来构建webservice接口.参考:http://blog.csdn.net/zztfj/article/details/7609347 解决方案三: 如果使用http协议来访问的话,去

php中创建和调用webservice接口示例_php实例

作为开发者来讲,要想写webservice接口或者调用别人的webservice接口,首先需要了解什么是webservice.简单说, WebService就是一些站点开放一些服务出来, 也可以是你自己开发的Service, 也就是一些方法, 通过URL,指定某一个方法名,发出请求,站点里的这个服务(方法),接到你的请求,根据传过来的参数,做一些处理,然后把处理后的结果以XML形式返回来给你,你的程序就解析这些XML数据,然后显示出来或做其它操作. 写webservice需要了解:基础的 Web

谁懂webservice接口,帮忙看下

问题描述 2011-09-2611:38:10cn.com.ultrapower.interfaces.uca.UCAImp.returnStatus(UCAImp.java:45)INFO:页面传入邮箱的参数为:yuxijin@e-chinalife.com;wangyuanyuan@e-chinalife.com;2011-09-2611:38:10cn.com.ultrapower.interfaces.uca.UCAImp.returnUCAIDByEmail(UCAImp.java:1