php soap实例讲解
一,什么是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);
- ?>
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>';
- ?>
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);
- ?>
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写的,你可以试着用多种语言来写,来测试一下。不管你是用php的模块,还是用nusoap,里面具体方法就不在这多说了,手册里面都有。
php soap实例讲解的更多相关文章
- float实例讲解
float实例讲解 float是个强大的属性,在实际前端开发过程中,人们经常拿它来进行布局,但有时,使用的不好,也麻烦多多啊. 比如,现在我们要实现一个两列布局,左边的列,宽度固定:右边的列,宽度自动 ...
- S3C2440上RTC时钟驱动开发实例讲解(转载)
嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤.一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便.如有错误之处,谢请指正. 共享资源,欢迎转载:http:/ ...
- 实例讲解Oracle数据库设置默认表空间问题
实例讲解Oracle数据库设置默认表空间问题 实例讲解Oracle数据库设置默认表空间问题,阅读实例讲解Oracle数据库设置默认表空间问题,DBA们经常会遇到一个这样令人头疼的问题:不知道谁在O ...
- 基于tcpdump实例讲解TCP/IP协议
前言 虽然网络编程的socket大家很多都会操作,但是很多还是不熟悉socket编程中,底层TCP/IP协议的交互过程,本文会一个简单的客户端程序和服务端程序的交互过程,使用tcpdump抓包,实例讲 ...
- makefile基础实例讲解 分类: C/C++ 2015-03-16 10:11 66人阅读 评论(0) 收藏
一.makefile简介 定义:makefile定义了软件开发过程中,项目工程编译链.接接的方法和规则. 产生:由IDE自动生成或者开发者手动书写. 作用:Unix(MAC OS.Solars)和Li ...
- 实例讲解Linux系统中硬链接与软链接的创建
导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说 ...
- spring事务传播机制实例讲解
http://kingj.iteye.com/blog/1680350 spring事务传播机制实例讲解 博客分类: spring java历险 天温习spring的事务处理机制,总结 ...
- 实例讲解MySQL联合查询
好了终于贴完了MySQL联合查询的内容了,加上上一篇一共2篇,都是我转载的,实例讲解MySQL联合查询.那下面就具体讲讲简单的JOIN的用法了.首先我们假设有2个表A和B,他们的表结构和字段分别为: ...
- Html代码seo优化最佳布局实例讲解
搜索引擎对html代码是非常优化的,所以html的优化是做好推广的第一步.一个符合seo规则的代码大体如下界面所示. 1.<!–木庄网络博客–> 这个东西是些页面注释的,可以在这里加我的& ...
随机推荐
- HDU 1698 Just a Hook(线段树:区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1698 题意:给出1~n的数,每个数初始为1,每次改变[a,b]的值,最后求1~n的值之和. 思路: 区间更新题目 ...
- JDBC中的事物处理
一项事物是由一个或是多个操作所组成的一个不可分割的工作单元.我们通过提交commit()或是回退rollback()来结束事务的操作. JDBC的事物处理包括三个方面:1:自动提交模式: 2:事务隔离 ...
- BigDecimalUtils BigDecimal加减乘除
public class BigDecimalUtil { private static int DEF_DIV_SCALE = 10; // 默认精确的小数位 /** * 提供精确的加法运算. * ...
- 巴什博奕——hdu2149
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f ...
- 12.2 Web窗体--代码片段详解
第12章 使用Web窗体 ※ 除常规HTML元素之外,Web窗体文件还包含另外3种内容:代码片段.可编程HTML元素和控件 ※ 代码隐藏类只应包含特定于单个Web窗体的代码.如果存在多个Web窗体 ...
- vue-cli如何添加多种环境变量
vue-cli如何添加多种环境变量 目前webpack(vue-cli) 打包有两种变量,development, productor, 如何添加一个 test的测试环境呢 vue-cli 3.0 v ...
- 在JavaScript中进行文件处理,第五部分:Blobs
译注:原文是<JavaScript高级程序设计>的作者Nicholas Zakas写的,本翻译纯属为自己学习而做,仅供参考.原文链接:这里 到目前为止,这个系列的帖子集中在和这些文件交互- ...
- 【跟着stackoverflow学Pandas】 -Get list from pandas DataFrame column headers - Pandas 获取列名
最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...
- SpringDataJPA最佳实践(一)简介
在团队中使用SpringDataJPA有一段时间了,也踩过一些坑,这里记录一下学习历程. 1.简介 Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架 ...
- ubuntu16.04 源码安装Python3.7 (可以在此基础上安装Tensorflow) (确保Tensorflow计算框架与系统的彻底隔离)
Python3.7 源码下载: https://www.python.org/downloads/release/python-370/ 解压源码: tar -zxvf Python-3.7.0.tg ...