PHP的soap使用

来源:互联网 发布:淘宝上买电瓶车靠谱吗 编辑:程序博客网 时间:2024/06/05 22:59

最近的工作项目中,接触到了很多的政府 微信开发项目。对方的外包公司都是使用JAVA作为开发语言,然后通过WEBSERVICE进行接口返回数据到我的项目中。一般情况下,能在浏览器打开并显示数据的接口是直接可以使用 CURL或者file_get_contents进行接收的。但是WEBSERVICE是使用Soapservice。而我们知道,从php 5之后,php自身已经提供了通过 SoapClient 调用webservice的方法。使用方法很简单:

$client = SoapClient('$wsdl');                 //也可以使用SoapClient('$wsdl', 'UTF-8')设定特定的编码。$client->__soapCall($functionName, $params);

调用时可能出现的问题:

1:提示”Class ‘SoapClient’ not found”。

说明没有安装php-SOAP服务。在linux下使用

yum search soap | grep php
如果是Ubuntu系统,可以使用apt-get命令查找soap并安装。

安装完成后,重启apache服务即可。

2:无法传递参数,webservice收到的参数均为null。

原因是webservice限制了提交的参数必须为键值对形式,传递参数时要用

$params = array( array('key'=>'value' , 'key2'=>'value2', 'key3'=>'value3') )

的方式。或者将参数声明为一个class,之后使用

$params = array( new class )

进行传递。
这时候你肯定会困惑,这个'key'值用什么名称,这时候,你可以调用下面的脚本,查看下,所有接口函数的参数需要使用什么key值。

<?php// to see formated types$soap = new SoapClient('http://domain.com/ws.php?WSDL');echo '<pre>';echo '<h2>Types:</h2>';$types = $soap->__getTypes();foreach ($types as $type) {    $type = preg_replace(        array('/(\w+) ([a-zA-Z0-9]+)/', '/\n /'),        array('<font color="green">${1}</font> <font color="blue">${2}</font>', "\n\t"),        $type    );    echo $type;    echo "\n\n";}echo '</pre>'; 

此部分参考http://www.php.net/manual/zh/soapclient.soapcall.php的说明。

3:总结:php有两个扩展可以实现web service,一个是NuSoap,一个是php 官方的soap扩展,由于soap是官方的,所以我们这里以soap来实现web service.由于默认是没有打开soap扩展的,所以自己先看一下soap扩展有没有打开。在soap编写web service的过程中主要用到了SoapClient,SoapServer,SoapFault三个类。

SoapClient类
这个类用来使用Web services。SoapClient类可以作为给定Web services的客户端。它有两种操作形式:

  • WSDL 模式
  • Non-WSDL 模式

在WSDL模式中,构造器可以使用WSDL文件名作为参数,并从WSDL中提取服务所使用的信息。
non-WSDL模式中使用参数来传递要使用的信息。

SoapServer类
这个类可以用来提供Web services。与SoapClient类似,SoapServer也有两种操作模式:WSDL模式和non-WSDL模式。这两种模式的意义跟 SoapClient的两种模式一样。在WSDL模式中,服务实现了WSDL提供的接口;在non-WSDL模式中,参数被用来管理服务的行为。

在SoapServer类的众多方法中,有三个方法比较重要。它们是SoapServer::setClass(),SoapServer::addFunction()和SoapServer::handle()。

下面给出实例:
定义一个提供服务的php类,这个类所提供的函数就是web service对外提供的服务

<?phpClass PersonInfo{    /**     *    返回姓名     *    @return string      *     */    public function getName(){        return "My Name is Chance";    }}?>

下面给出服务器端的代码:

1 <?php 2 //包含提供服务的类进来 3 require_once('PersonInfo.php'); 4  5 //wsdl方式提供web service,如果生成了wsdl文件则可直接传递到//SoapServer的构造函数中 6 //$s = new SoapServer('PersonInfo.wsdl'); 7  8 //doesn't work 只有location不能提供web service 9 //output:looks like we got no XML document10 //$s = new SoapServer(null,array("location"=>"http://localhost/Test/MyService/Server.php"));11 12 //下面两种方式均可以工作,只要指定了相应的uri13 //$s = new SoapServer(null,array("uri"=>"Server.php"));14 $s = new SoapServer(null,array("location"=>"http://localhost/Test/MyService/Server.php","uri"=>"Server.php"));15 16 $s -> setClass("PersonInfo");17 18 $s -> handle();19 ?>

下面是客户端代码:

 1 <?php 2 try{ 3     //wsdl方式调用web service 4     //wsdl方式中由于wsdl文件写定了,如果发生添加删除函数等操作改动,不会反应到wsdl,相对non-wsdl方式 5     //来说不够灵活 6     //$soap = new SoapClient("http://localhost/Test/MyService/PersonInfo.wsdl"); 7      8     //non-wsdl方式调用web service     9     //在non-wsdl方式中option location系必须提供的,而服务端的location是选择性的,可以不提供10     $soap = new SoapClient(null,array('location'=>"http://localhost/Test/MyService/Server.php",'uri'=>'Server.php'));11     12     //两种调用方式,直接调用方法,和用__soapCall简接调用13     $result1 = $soap->getName();14     $result2 = $soap->__soapCall("getName",array());15     echo $result1."<br/>";16     echo $result2;17     18 }catch(SoapFault $e){19     echo $e->getMessage();20 }catch(Exception $e){21     echo $e->getMessage();22 }23 

24 ?>

转载自:http://www.yunxiu.org/blog/article/5534.htm

自己写的demo地址 http://download.csdn.net/detail/u014359108/8796093

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 学不会汽修怎么办 挖掘机发票丢了怎么办 工会经费多缴怎么办 机票姓名错了怎么办 抹胸衣服下掉怎么办 穿抹胸很容易掉怎么办 抹胸衣服老掉怎么办 群里有低俗的人怎么办 老师不收礼物怎么办 发票跨年了怎么办 一用力就头疼怎么办 小孩天天玩游戏怎么办 手机分期人死了怎么办 人死了手机欠费怎么办 晚上想玩手机怎么办 孩子溺水后发烧怎么办 去台湾多次签证怎么办 怀孕不能玩手机怎么办 孕期天天玩手机怎么办 小孩子在家偷钱怎么办 小朋友被鸡抓伤怎么办 宝宝在学校不说怎么办? 宝宝不和小朋友玩怎么办 初中孩子不想上学怎么办 孩子装病不想上学怎么办 中学生叛逆不愿意上学怎么办 孩子去幼儿园哭闹怎么办 孩子哭闹不上学怎么办 孩子中班还哭怎么办 小孩子不爱上幼儿园怎么办 小孩子不爱去幼儿园怎么办 宝宝去幼儿园哭闹怎么办 宝宝上幼儿园哭闹怎么办 小朋友上幼儿园哭闹怎么办 迷路了怎么办幼儿故事 大班迷路了怎么办故事 玩手机眼睛干涩怎么办 宝睡觉不踏实怎么办 觉得自己老了怎么办 微信没自动扣费怎么办 东西放在家找不到怎么办