php soap实例讲解

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实例讲解,布布扣,bubuko.com

时间: 2024-10-25 05:48:32

php soap实例讲解的相关文章

Android 实例讲解HorizontalScrollView实现左右滑动

本博文主要讲解怎么使用HorizontalScrollView实现左右滑动的效果. HorizontalScrollView实际上是一个FrameLayout ,一般通过只放置一个LinearLayout子控件.如果要使其添加其他的控件,就使用LinearLayout子控件来添加其他的控件,最后达到丰富其内容的效果.其中,LinearLayout设置的orientation布局为Horizontal.HorizontalScrollView不可以和ListView同时用,因为ListView有自

多线程之间的通信实例讲解

                 多线程之间的通信实例讲解对于线程来说,说白了,就是一个函数,如果大家对于这章函数都有理解,那我对于操作系统,线程和进程间的通信会有一个新的认识!接下来我会对每一行代码进行注释,在此过程中,大家也可以对c语言有一个崭新的认识. 第一个函数,创建两个线程. #include <stdio.h>#include <pthread.h>    这个头函数要包含,因为我们后续用的函数都是系统调用,因此需要申请头函数   这样在编译的时候,就可以找到此函数的源

Java JUC之Atomic系列12大类实例讲解和原理分解

Java JUC之Atomic系列12大类实例讲解和原理分解 2013-02-21      0个评论       作者:xieyuooo 收藏    我要投稿 在java6以后我们不但接触到了Lock相关的锁,也接触到了很多更加乐观的原子修改操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,以及并发中的ABA问题,本文讲述Atomic系列的类的实现以及使用方法,其中包含: 基本类:AtomicInteger.AtomicLong.Atomic

Android 依赖注入: Dagger 2 实例讲解(一)

本文原创,转载请注明出处:http://blog.csdn.net/zjbpku 关于Dagger,在之前的博文(Android 依赖注入:Dagger 实例讲解(Demo下载))中已有介绍, 本文说的Dagger 2主要是由Google技术 人员参与开发的,当然包括Square的各位及其他一些Contributors在内的大牛也贡献了不少.该项目大概是从去年11月份开始启动的,到目前该项 目还在继续进行,Snapshot version也是刚刚发布不久,从Github提供的内容看,不久会是Pr

Oracle之索引(Index)实例讲解 - 基础

Oracle之索引(Index)实例讲解 - 基础 索引(Index)是关系数据库中用于存放表中每一条记录位置的一种对象,主要目的是加快数据的读取速度和数据的完整性检查.索引的建立是一项技术性要求非常高的工作. 一般在数据库设计阶段就要考虑到如何设计和创建索引. 1. 创建索引 创建索引的语法: CREATE [UNIQUE] INDEX [schema.] index ON [schema.] table (column [ASC | DESC], column [ASC | DESC]...

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

导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说起,下面就以实例讲解Linux系统中硬链接与软链接的创建,来实际看看Linux中两种链接方式的不同. 首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现

触发器实例讲解

SQL触发器实例讲解(本文是来自百度文库) 备注:本人建了一个站特价汇,我想记录每个商品的点击量,然后按照点击量来牌名商品,想要提高效率,所以必须得用触发器,下面是本人在百度文库中的找到的学习资料,分享下给大家. 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Insert , Update , Delete 事件. 我为什么要使用触发器?比如,这么两个表: Create T

PHP中”单例模式“实例讲解【转】

转自::http://www.cnblogs.com/hongfei/archive/2012/07/07/2580994.html 假设我们需要写一个类用来操作数据库,并同时满足以下要求: ①SqlHelper类只能有一个实例(不能多)②SqlHelper类必须能够自行创建这个实例③必须自行向整个系统提供这个实例,换句话说:多个对象共享一块内存区域,比如,对象A设置了某些属性值,则对象B,C也可以访问这些属性值(结尾的例子很好的说明了这个问题) 1 <?php 2 class SqlHelpe

SQL触发器实例讲解

定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.       常见的触发器有三种:分别应用于Insert , Update , Delete 事件. 我为什么要使用触发器?比如,这么两个表: Create Table Student(              --学生表         StudentID int primary key,       --学号         ....        )