一,什么是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

查看复制打印?

  1. <?php
  2. //包函nusoap.php
  3. require_once('./lib/nusoap.php');
  4. //创建服务端
  5. $server = new soap_server;
  6. //定义客户端调用方法
  7. $server->register('hello');
  8. //调用方法以及参数
  9. function hello($name) {
  10. return 'Hello, ' . $name;
  11. }
  12. $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
  13. $server->service($HTTP_RAW_POST_DATA);
  14. ?>

b,客户端hello.php

查看复制打印?

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

2,使用wsld

a,服务器端

查看复制打印?

  1. <?php
  2. //包函nusoap.php
  3. require_once('./lib/nusoap.php');
  4. //新建一个soap服务
  5. $server = new soap_server();
  6. //初始化支持wsdl
  7. $server->configureWSDL('hellowsdl2', 'urn:hellowsdl2');
  8. //定义数据结构来接收数据
  9. $server->wsdl->addComplexType(
  10. 'Person',
  11. 'complexType',
  12. 'struct',
  13. 'all',
  14. '',
  15. array(
  16. 'firstname' => array('name' => 'firstname', 'type' => 'xsd:string'),//后面的type定义数据的类型,这个是string
  17. 'age' => array('name' => 'age', 'type' => 'xsd:int'),//后面的type定义数据的类型,这个是int
  18. 'gender' => array('name' => 'gender', 'type' => 'xsd:string')//后面的type定义数据的类型,这个是string
  19. )
  20. );
  21. $server->wsdl->addComplexType(
  22. 'SweepstakesGreeting',
  23. 'complexType',
  24. 'struct',
  25. 'all',
  26. '',
  27. array(
  28. 'greeting' => array('name' => 'greeting', 'type' => 'xsd:string'),
  29. 'winner' => array('name' => 'winner', 'type' => 'xsd:string')
  30. )
  31. );
  32. //服务器定义的soap调用方法
  33. $server->register('hello',                    // 方法名字hello,方法就在下面
  34. array('person' => 'tns:Person'),          // 客户端传来的变量
  35. array('return' => 'tns:SweepstakesGreeting'),    //返回参数
  36. 'urn:hellowsdl2',                         // soap名
  37. 'urn:hellowsdl2#hello',                   // soap的方法名
  38. 'rpc',                                    // 使用的方式
  39. 'encoded',                                // 编码
  40. 'test'                                    // 存档
  41. );
  42. //定义上面注册过的函数hello
  43. function hello($person) {
  44. $greeting = 'Hello, ' . $person['firstname'] .
  45. '. It is nice to meet a ' . $person['age'] .
  46. ' year old ' . $person['gender'] . '.';
  47. $winner =  'Scott';
  48. //要返回的数据
  49. return array(
  50. 'greeting' => $greeting,
  51. 'winner' => $winner
  52. );
  53. }
  54. // 请求时(试图)调用服务
  55. $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
  56. $server->service($HTTP_RAW_POST_DATA);
  57. ?>

b,客户端

查看复制打印?

  1. <?php
  2. //包函nusoap.php
  3. require_once('./lib/nusoap.php');
  4. //新建一个soap客户端,调用服务端提供的wsdl
  5. //$client = new soapclient('http://localhost/test/hellowsdl2.php?wsdl', true);
  6. $client = new soapclient('http://localhost/test/helloworld2.php');
  7. //查看一下是不是报错
  8. $err = $client->getError();
  9. if ($err) {
  10. //显示错误
  11. echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
  12. }
  13. //要向服务端要传的参数
  14. $person = array('firstname' => 'Willi', 'age' => 22, 'gender' => 'male');
  15. //调用服务端的方法
  16. $result = $client->call('hello', array('person' => $person));
  17. //错误审核
  18. if ($client->fault) {
  19. echo '<h2>Fault</h2><pre>';
  20. print_r($result);
  21. echo '</pre>';
  22. } else {
  23. $err = $client->getError();
  24. if ($err) {
  25. echo '<h2>Error</h2><pre>' . $err . '</pre>';
  26. } else {
  27. echo '<h2>Result</h2><pre>';
  28. print_r($result);
  29. echo '</pre>';
  30. }
  31. }
  32. //显示请求信息
  33. echo '<h2>Request</h2>';
  34. echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
  35. //显示返回信息
  36. echo '<h2>Response</h2>';
  37. echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
  38. //显示调试信息
  39. echo '<h2>Debug</h2>';
  40. echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
  41. ?>

上面二个例子不管是客户端,还是服务器端,都是用php写的,你可以试着用多种语言来写,来测试一下。不管你是用php的模块,还是用nusoap,里面具体方法就不在这多说了,手册里面都有。

来源:https://www.cnblogs.com/caicaizi/p/6734130.html

php soap实例讲解相关推荐

  1. php simplexml_load_file 详解,php中simplexml_load_file函数用法实例讲解

    php中simplexml_load_file函数用法实例讲解 发布于 2015-02-07 06:53:40 | 136 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文 ...

  2. java实现页面高效刷新_selenium高效应对Web页面元素刷新的实例讲解

    当我们在页面上进行selenium.type()或者selenium.click()操作的时候,往往需要需要等待一个元素的出现,对于一般的网页,当我们进入一个新页面的时候,往往会使用selenium. ...

  3. php 返回一个json对象,PHP给前端返回一个JSON对象的实例讲解

    解决问题:用php做后台时,如何给前端发起的AJAX请求返回一个JSON格式的"对象": 说明:我本身是一个前端,工作久了之后发现要是不掌握一门后端开发语言的话,总感觉有点无力.最 ...

  4. python简易版实例_Python3之简单搭建自带服务器的实例讲解

    WEB开发,我们先从搭建一个简单的服务器开始,Python自带服务模块,且python3相比于python2有很大不同, 在Python2.6版本里,/usr/bin/lib/python2.6/ 目 ...

  5. 手摸手教你数据可视化!(附实例讲解)

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:CrescentAI,华南理工大学,Datawhale优秀学习者 ...

  6. 【Python基础】手把手教你数据可视化!(附实例讲解)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:CrescentAI,华南理工大学,Datawhale优秀学 ...

  7. php脚本函数,PHP执行系统命令函数实例讲解

    命令注入 命令注入(Command Injection),对一些函数的参数没有做过滤或过滤不严导致的,可以执行系统或者应用指令(CMD命令或者 bash 命令)的一种注入攻击手段. 常见的执行系统命令 ...

  8. 实例讲解之校园网病毒该如何铲除

    实例讲解之校园网病毒该如何铲除 转载于:https://blog.51cto.com/wilsondy/163994

  9. httpclient 调取接口_使用HttpClient调用接口的实例讲解

    一,编写返回对象 public class HttpResult { // 响应的状态码 private int code; // 响应的响应体 private String body; get/se ...

最新文章

  1. 5.1.14 守护线程
  2. Heap Allocation Profiles (heap=sites)
  3. java继承的关键字_超级关键字在Java继承中的作用
  4. 理解stl中的erase
  5. void 类型的指针
  6. 开源C# Winform控件库《SunnyUI》强力推荐
  7. 制作斜坡单元的两种方法
  8. get,post请求的编码统一
  9. 四川大学c语言真题及答案新课标,四川大学C语言2003年真题_跨考网
  10. relu函数为分段线性函数,为什么会增加非线性元素
  11. QGraphicsView,QGraphicsScene,QGraphicsItem
  12. 【js特效】一款不错的flash视频播放器
  13. matlab的默认字体_为MATLAB更换支持中文的等宽字体
  14. mysql 中的neq_mysql中neq使用Python的Django框架中的压缩组件Django Compressor_MySQL
  15. 东莞地铁1号线黄江北站主体结构全面封顶
  16. lnoi2019游记
  17. ABP框架—项目文件介绍(2)
  18. 生活随笔:第一次见家长注意事项
  19. 程序员晒端午福利,网友:看了你的福利我想摔手机
  20. 分享十个前端Web3D可视化框架附地址

热门文章

  1. 「Python」Terminal / cmd中的Python命令解释器中的pip操作
  2. 04_Weblogic之受管服务器:配置受管服务器,启动受管服务器,解决因为强制关闭Weblogic之后导致启动有问题的问题,配置boot.properties
  3. Python AdaBoost提升算法
  4. VGA、DVI、HDMI、DP、Type-C不同视频接口有啥区别?
  5. 深度残差网络和Highway网络
  6. First Unique Character in a String(字符串中的第一个唯一字符)
  7. 持续集成工具jenkins的部署--Windows篇
  8. Redis高级特性及优化
  9. C# 多线程之List的线程安全问题
  10. BZOJ1503[NOI2004]郁闷的出纳员——treap