设为首页 收藏本站
查看: 802|回复: 0

[经验分享] php soap实例讲解

[复制链接]

尚未签到

发表于 2015-8-28 11:33:06 | 显示全部楼层 |阅读模式
  一,什么是soap,什么是wsdl,为什么要用他们
  SOAP是基于XML和HTTP通信协议,xml各种平台,各种语言都支持的一个种语言。http呢它得到了所有的因特网浏览器及服务器的支持。
  WSDL 指网络服务描述语言 (Web Services Description Language),是一种使用 XML 编写的文档。这种文档可描述某个 Web service。它可规定服务的位置,以及此服务提供的操作。
  我是做php的,你是java的,他是做.net,如果我们三个之间要进行通信,要进行数据交换,怎么办呢?我们需要一个能和我们都能通信的工具。soap,wsdl被创造出来,使得运行在不同的操作系统并使用不同的技术和编程语言的应用程序可以互相进行通信。
  二,实例
  如果php要使用soap的话,通常做法是,添加了一下php的soap模块,在php.ini里面加上soap.so,下面介绍一个不要添加soap.so文件,也可以实现soap的方法
  nusoap是php写的一个功能文件,包涵进来就可以用了,网上很多自己去搜一下吧。
  1,不使用wsdl
  a,服务端helloworld2.php


  • <?php  
  • //包函nusoap.php  
  • require_once('./lib/nusoap.php');  
  •   
  • //创建服务端  
  • $server = new soap_server;  
  •   
  • //定义客户端调用方法  
  • $server->register('hello');  
  •   
  • //调用方法以及参数  
  • function hello($name) {  
  • return 'Hello, ' . $name;  
  • }  
  •   
  • $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';  
  • $server->service($HTTP_RAW_POST_DATA);  
  • ?>  

<?php//包函nusoap.phprequire_once('./lib/nusoap.php');//创建服务端$server = new soap_server;//定义客户端调用方法$server->register('hello');//调用方法以及参数function hello($name) { return 'Hello, ' . $name;}$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';$server->service($HTTP_RAW_POST_DATA);?>
  b,客户端hello.php


  • <?php  
  • //包函nusoap.php  
  • require_once('./lib/nusoap.php');  
  • //新建一个soap客户端,调用服务端提供的wsdl  
  • //$client = new soapclient('http://localhost/test/hellowsdl2.php?wsdl', true);  
  • $client = new soapclient('http://localhost/test/helloworld2.php');  
  • //查看一下是不是报错  
  • $err = $client->getError();  
  • if ($err) {  
  • //显示错误  
  • echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';  
  • }  
  •   
  • //调用服务端的方法  
  • $result = $client->call('hello', array('person' => "this is a test"));  
  •   
  • echo '<h2>Result</h2><pre>';  
  • print_r($result);  
  • echo '</pre>';  
  • ?>  

<?php//包函nusoap.phprequire_once('./lib/nusoap.php');//新建一个soap客户端,调用服务端提供的wsdl//$client = new soapclient('http://localhost/test/hellowsdl2.php?wsdl', true);$client = new soapclient('http://localhost/test/helloworld2.php');//查看一下是不是报错$err = $client->getError();if ($err) { //显示错误 echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';}//调用服务端的方法$result = $client->call('hello', array('person' => "this is a test"));echo '<h2>Result</h2><pre>';print_r($result);echo '</pre>';?>
  2,使用wsld
  a,服务器端


  • <?php  
  • //包函nusoap.php  
  • require_once('./lib/nusoap.php');  
  • //新建一个soap服务  
  • $server = new soap_server();  
  • //初始化支持wsdl  
  • $server->configureWSDL('hellowsdl2', 'urn:hellowsdl2');  
  • //定义数据结构来接收数据  
  • $server->wsdl->addComplexType(  
  • 'Person',  
  • 'complexType',  
  • 'struct',  
  • 'all',  
  • '',  
  • array(  
  • 'firstname' => array('name' => 'firstname', 'type' => 'xsd:string'),//后面的type定义数据的类型,这个是string  
  • 'age' => array('name' => 'age', 'type' => 'xsd:int'),//后面的type定义数据的类型,这个是int  
  • 'gender' => array('name' => 'gender', 'type' => 'xsd:string')//后面的type定义数据的类型,这个是string  
  • )  
  • );  
  • $server->wsdl->addComplexType(  
  • 'SweepstakesGreeting',  
  • 'complexType',  
  • 'struct',  
  • 'all',  
  • '',  
  • array(  
  • 'greeting' => array('name' => 'greeting', 'type' => 'xsd:string'),  
  • 'winner' => array('name' => 'winner', 'type' => 'xsd:string')  
  • )  
  • );  
  • //服务器定义的soap调用方法  
  • $server->register('hello',                    // 方法名字hello,方法就在下面  
  • array('person' => 'tns:Person'),          // 客户端传来的变量  
  • array('return' => 'tns:SweepstakesGreeting'),    //返回参数  
  • 'urn:hellowsdl2',                         // soap名  
  • 'urn:hellowsdl2#hello',                   // soap的方法名  
  • 'rpc',                                    // 使用的方式  
  • 'encoded',                                // 编码  
  • 'test'                                    // 存档  
  • );  
  • //定义上面注册过的函数hello  
  • function hello($person) {  
  • $greeting = 'Hello, ' . $person['firstname'] .  
  • '. It is nice to meet a ' . $person['age'] .  
  • ' year old ' . $person['gender'] . '.';  
  •   
  • $winner =  'Scott';  
  • //要返回的数据  
  • return array(  
  • 'greeting' => $greeting,  
  • 'winner' => $winner  
  • );  
  • }  
  • // 请求时(试图)调用服务  
  • $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';  
  • $server->service($HTTP_RAW_POST_DATA);  
  • ?>  

<?php//包函nusoap.phprequire_once('./lib/nusoap.php');//新建一个soap服务$server = new soap_server();//初始化支持wsdl$server->configureWSDL('hellowsdl2', 'urn:hellowsdl2');//定义数据结构来接收数据$server->wsdl->addComplexType( 'Person', 'complexType', 'struct', 'all', '', array( 'firstname' => array('name' => 'firstname', 'type' => 'xsd:string'),//后面的type定义数据的类型,这个是string 'age' => array('name' => 'age', 'type' => 'xsd:int'),//后面的type定义数据的类型,这个是int 'gender' => array('name' => 'gender', 'type' => 'xsd:string')//后面的type定义数据的类型,这个是string ));$server->wsdl->addComplexType( 'SweepstakesGreeting', 'complexType', 'struct', 'all', '', array( 'greeting' => array('name' => 'greeting', 'type' => 'xsd:string'), 'winner' => array('name' => 'winner', 'type' => 'xsd:string') ));//服务器定义的soap调用方法$server->register('hello',                    // 方法名字hello,方法就在下面 array('person' => 'tns:Person'),          // 客户端传来的变量 array('return' => 'tns:SweepstakesGreeting'),    //返回参数 'urn:hellowsdl2',                         // soap名 'urn:hellowsdl2#hello',                   // soap的方法名 'rpc',                                    // 使用的方式 'encoded',                                // 编码 'test'                                    // 存档);//定义上面注册过的函数hellofunction hello($person) { $greeting = 'Hello, ' . $person['firstname'] . '. It is nice to meet a ' . $person['age'] . ' year old ' . $person['gender'] . '.'; $winner =  'Scott';//要返回的数据 return array( 'greeting' => $greeting, 'winner' => $winner );}// 请求时(试图)调用服务$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';$server->service($HTTP_RAW_POST_DATA);?>
  b,客户端


  • <?php  
  • //包函nusoap.php  
  • require_once('./lib/nusoap.php');  
  • //新建一个soap客户端,调用服务端提供的wsdl  
  • //$client = new soapclient('http://localhost/test/hellowsdl2.php?wsdl', true);  
  • $client = new soapclient('http://localhost/test/helloworld2.php');  
  • //查看一下是不是报错  
  • $err = $client->getError();  
  • if ($err) {  
  • //显示错误  
  • echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';  
  • }  
  • //要向服务端要传的参数  
  • $person = array('firstname' => 'Willi', 'age' => 22, 'gender' => 'male');  
  •   
  • //调用服务端的方法  
  • $result = $client->call('hello', array('person' => $person));  
  • //错误审核  
  • if ($client->fault) {  
  • echo '<h2>Fault</h2><pre>';  
  • print_r($result);  
  • echo '</pre>';  
  • } else {  
  • $err = $client->getError();  
  • if ($err) {  
  • echo '<h2>Error</h2><pre>' . $err . '</pre>';  
  • } else {  
  • echo '<h2>Result</h2><pre>';  
  • print_r($result);  
  • echo '</pre>';  
  • }  
  • }  
  • //显示请求信息  
  • echo '<h2>Request</h2>';  
  • echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';  
  • //显示返回信息  
  • echo '<h2>Response</h2>';  
  • echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';  
  • //显示调试信息  
  • echo '<h2>Debug</h2>';  
  • echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';  
  • ?>  

<?php//包函nusoap.phprequire_once('./lib/nusoap.php');//新建一个soap客户端,调用服务端提供的wsdl//$client = new soapclient('http://localhost/test/hellowsdl2.php?wsdl', true);$client = new soapclient('http://localhost/test/helloworld2.php');//查看一下是不是报错$err = $client->getError();if ($err) { //显示错误 echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';}//要向服务端要传的参数$person = array('firstname' => 'Willi', 'age' => 22, 'gender' => 'male');//调用服务端的方法$result = $client->call('hello', array('person' => $person));//错误审核if ($client->fault) { echo '<h2>Fault</h2><pre>'; print_r($result); echo '</pre>';} else { $err = $client->getError(); if ($err) { echo '<h2>Error</h2><pre>' . $err . '</pre>'; } else { echo '<h2>Result</h2><pre>'; print_r($result); echo '</pre>'; }}//显示请求信息echo '<h2>Request</h2>';echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';//显示返回信息echo '<h2>Response</h2>';echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';//显示调试信息echo '<h2>Debug</h2>';echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';?>
  上面二个例子不管是客户端,还是服务器端,都是用php写的,你可以试着用多种语言来写,来测试一下。不管你是用php的模块,还是用nusoap,里面具体方法就不在这多说了,手册里面都有。
  
  
  
  
  SOAP在这里就不用介绍了,  这里只是简单的实现一个SOAP的实例, 不多说 ,看代码吧。 soap分为server和client, 我们要使client去调用server的代码. 首先看server短的代码:

  
  这个是server端的代码: server.php
      <?php
    //声明一个函数add() ,并返回它的值
        function add($a,$b){
        return $a+$b;
        }
    //实例化一个SoapServer对象, 并将add函数注册成为其方法
        $server = new SoapServer(null,array('uri'=>'http://localhost/')); //指定server端代码的URI(资源标志符)
        $server->addFunction("add");
        $server->handle();
    ?>
  然后使用client端的代码来调用server端的代码: client的代码也很简单: 如下:
  这个是client端的代码 client.php
      <?php
    //建立一个参数数组,存储要访问的提供soap服务的计算机的地址与程序
        $arrOptions=array(
            'uri'=>'http://localhost/',
            'location'=>'http://localhost/soap/server.php',  //注意: 这个location指定的是server端代码在服务器中的具体位置, 我的是在本地根目录下的soap目录中,
            'trace'=>true,
        );
        $soapObject = new SoapClient(null,$arrOptions); //实例化客户端对象
        echo $soapObject->add(20,30); //调用服务器端的函数add并返回值50
    ?>
  ok, 结束了 !

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-105481-1-1.html 上篇帖子: PHP 调用ffmpeg 下篇帖子: [轉載]史上最强php生成pdf文件,html转pdf文件方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表