一,什么是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,里面具体方法就不在这多说了,手册里面都有。

php soap实例讲解的更多相关文章

  1. float实例讲解

    float实例讲解 float是个强大的属性,在实际前端开发过程中,人们经常拿它来进行布局,但有时,使用的不好,也麻烦多多啊. 比如,现在我们要实现一个两列布局,左边的列,宽度固定:右边的列,宽度自动 ...

  2. S3C2440上RTC时钟驱动开发实例讲解(转载)

    嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤.一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便.如有错误之处,谢请指正. 共享资源,欢迎转载:http:/ ...

  3. 实例讲解Oracle数据库设置默认表空间问题

    实例讲解Oracle数据库设置默认表空间问题   实例讲解Oracle数据库设置默认表空间问题,阅读实例讲解Oracle数据库设置默认表空间问题,DBA们经常会遇到一个这样令人头疼的问题:不知道谁在O ...

  4. 基于tcpdump实例讲解TCP/IP协议

    前言 虽然网络编程的socket大家很多都会操作,但是很多还是不熟悉socket编程中,底层TCP/IP协议的交互过程,本文会一个简单的客户端程序和服务端程序的交互过程,使用tcpdump抓包,实例讲 ...

  5. makefile基础实例讲解 分类: C/C++ 2015-03-16 10:11 66人阅读 评论(0) 收藏

    一.makefile简介 定义:makefile定义了软件开发过程中,项目工程编译链.接接的方法和规则. 产生:由IDE自动生成或者开发者手动书写. 作用:Unix(MAC OS.Solars)和Li ...

  6. 实例讲解Linux系统中硬链接与软链接的创建

    导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说 ...

  7. spring事务传播机制实例讲解

    http://kingj.iteye.com/blog/1680350   spring事务传播机制实例讲解 博客分类:   spring java历险     天温习spring的事务处理机制,总结 ...

  8. 实例讲解MySQL联合查询

    好了终于贴完了MySQL联合查询的内容了,加上上一篇一共2篇,都是我转载的,实例讲解MySQL联合查询.那下面就具体讲讲简单的JOIN的用法了.首先我们假设有2个表A和B,他们的表结构和字段分别为: ...

  9. Html代码seo优化最佳布局实例讲解

    搜索引擎对html代码是非常优化的,所以html的优化是做好推广的第一步.一个符合seo规则的代码大体如下界面所示. 1.<!–木庄网络博客–> 这个东西是些页面注释的,可以在这里加我的& ...

随机推荐

  1. P4factory ReadMe Quickstart 安装p4factory

    操作系统: Ubuntu 14.04 前言 在之前,我直接从P4.org给的GitHub网址上下载了p4factory,但是在根据ReadMe的内容进行QuickStart的时候,发生了shell脚本 ...

  2. 51 Nod 1500 苹果曼和树(树形dp)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1500 思路: 树形dp. 我们考虑当前结点 i ,对于结点 i ,它可以 ...

  3. TimerPickerDialog 中 onTimeSet 执行两次的问题

    开发android小闹钟的程序时,在添加闹钟时闹钟列表中总是出现两个相同的闹钟. btnAddAlarm.setOnClickListener(new View.OnClickListener() { ...

  4. Java中泛型区别以及泛型擦除详解

    一.引言 复习javac的编译过程中的解语法糖的时候看见了泛型擦除中的举例,网上的资料大多比较散各针对性不一,在此做出自己的一些详细且易懂的总结. 二.泛型简介 泛型是JDK 1.5的一项新特性,一种 ...

  5. JSP 日期处理

    JSP 日期处理 使用JSP最重要的优势之一,就是可以使用所有Java API.本章将会详细地讲述Java中的Date类,它在java.util包下,封装了当前日期和时间. Date类有两个构造函数. ...

  6. php---------正则判断字符串中是否由汉字 数字 英文字母组成

    开发中常常用到正则表达式,分享两个常用的正则表达式,php检查字符串是否由汉字,数字,英文字母,下划线组成, 注意这里只是针对utf-8字符集的字符串检查. 数字 汉字 英文字母: if (!preg ...

  7. js数字进制转换

    其他进制转十进制: 使用 parseInt()函数,parseInt解析一个字符串参数,并返回一个指定基数的整数 ,用法如下: parseInt(string, radix); 以二进制为例,用法如下 ...

  8. 前端常用框架和js插件 UI组件等

    前言:写这个随笔,是记录一下工作以来用到的各种框架.以免日后忘记: JS库: 1. jquery.js 2. zepto.js ----jquery的精简版,专门用于手机上的,但是zepto主体默认是 ...

  9. 将int转int数组并将int数组元素处理后转int,实现加密

    package faceobject; import java.util.Arrays; public class Test { /** 加密问题 数据是小于8位的整数 先将数据倒序,然后将每位数字都 ...

  10. 探究js正则匹配方法:match和exec

    match是字符串方法,写法为:str.match(reg) exec是正则表达式方法,写法为:reg.exec(str) match和exec在匹配成功时返回的都是数组,在没有匹配上时返回的都是nu ...