PHP中调用Soap/WebService
关于在PHP中如何调用Soap/WebService的描述,网络上有不少帖子。但是主要讲述了如何用PHP开发服务器端、客户端并加以关联,而很少触及在PHP中调用现成的WebService的情况。在本文中我们做一个简单的示范。
一、寻找WebService来源
WebService可以自己编写,但是也可以从网络上去寻找现成的。我用的是www.xmethods.net里的US Zip Validator。它的WSDL文件位置在:http://www.webservicemart.com/uszip.asmx?WSDL。 它的作用是根据输入的ZIP代码,返回该代码对应的美国地名,州名,经纬度等。
二、创建SoapClient
第二步就是创建SoapClient,并调用WebService中的方法,并获得返回值。PHP代码如下:
$objSoapClient = new SoapClient("http://www.webservicemart.com/uszip.asmx?WSDL");
$param=array("ZipCode"=>$zip);
$out=$objSoapClient->ValidateZip($param);
$data=$out->ValidateZipResult;
SoapClient的创建有好多方法,我们用的是最标准的(也是最简单的)WSDL方法。由于查询ZIP的方法肯定需要一个参数,所以我们必须创建一个数组,用“参数名=>取值”的方式进行赋值。
也许读者会对这个数组的创建有一定的兴趣。比如,我们怎么知道“参数名”应该是“ZipCode”而不是别的什么呢?为什么没有更多的参数了,而只有一个?OK,这个问题我们稍后解释。因为这牵涉到WSDL的解读。
创建好参数后,同样的,我们调用SoapClient的方法ValidateZip,并传递参数进去;对于返回的结果,我们用$data变量取出我们真正感兴趣的东西。同样的,这里也存在方法名称是如何确定的问题。我们也在稍后介绍。
如果你也使用PhpEd进行PHP的开发和调试,那么从下面的调试窗口截图中,你可以很清除的看到$data和$out之间的关系:

三、解析数据
上面得到的$data中的数据是标准的XML结构的数据。所以在PHP中,我们需要创建一个XML解析器来对这个数据进行分析。代码如下:
$ParsedData=array();
function startElement($parser, $name, $attribs) {
global $ParsedData;
echo "<<font color="#0000cc">$name</font>";
if (count($attribs)) {
foreach ($attribs as $k => $v){
$ParsedData[$k]=$v;
echo " <font color="#009900">$k</font>="<font color="#990000">$v</font>"";
}
}
echo ">";
}
function endElement($parser, $name) {
echo "</<font color="#0000cc">$name</font>>";
}
$xml_parser= xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1);
xml_set_element_handler($xml_parser, "startElement", "endElement");
echo "<pre>";
if (!xml_parse($xml_parser, $data)) {
die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)),xml_get_current_line_number($xml_parser)));
}
echo "</pre>";
xml_parser_free($xml_parser);
这里的详细操作需要参考PHP函数手册中关于XML函数的那一章。这里不再赘述。一旦数据被解析成功,我们就可以进行进一步的处理。例如下面的代码就遍历该数组,然后输出:
foreach ($ParsedData as $k=>$v) { echo $k."=>".$v."<br />"; }
四、解读WSDL
上 面我们留下了两个疑问:如何知道一个WebService提供的方法,以及它的参数?所有的答案都在WSDL描述中。对于本文使用的WSDL来说,我们 从中截取一段来分析。由于我们是通过Soap进行调用,所以我对完整的WSDL进行了节选,只列出关于Soap调用的部分(反相显示的部分):

首先我们注意到<wsdl:message name=”ValidateZipSoapIn”>这一节,它指出了在Soap调用中,入口参数要参照ValidateZip,于是我们接着转到文件上面一点的地方,看ValidateZip方法的定义:
<s:element name="ValidateZip"> <s:complexType>
<s:sequence> <s:element minOccurs="0" maxOccurs="1" name="ZipCode" type="s:string"/> </s:sequence> </s:complexType> </s:element>
很明显,ValidateZip要求一个参数,名称为ZipCode,类型为string。
同 样,我们再看<wsdl:message name=”ValidateZipSoapOut”>这一节,它指出Soap调用的出口参数是ValidateZipResponse。而后者的 传出参数名称是ValidateZipResult。于是,我们就解释了前两节提出的问题:
PHP中调用Soap/WebService的更多相关文章
- httpclient妙用一 httpclient作为客户端调用soap webservice(转)
前面有一篇使用HttpClient调用带参数的post接口方法,这里找到一篇使用HttpClient调用Soap协议接口的方式. 原文地址:httpclient妙用一 httpclient作为客户端调 ...
- C++程序中调用WebService的实现
前言 因为最近的项目中需要运用到在MFC程序中调用WebService里面集成好了的函数,所以特意花了一天的时间来研究WebService的构建以及如何在MFC的程序中添加Web引用,进而来实现在C+ ...
- 在Android中调用WebService
某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查.我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数 ...
- 在Android中调用C#写的WebService(附源代码)
由于项目中要使用Android调用C#写的WebService,于是便有了这篇文章.在学习的过程中,发现在C#中直接调用WebService方便得多,直接添加一个引用,便可以直接使用将WebServi ...
- 终于解决了PHP调用SOAP过程中的种种问题。(转)
最近在做公司和第三方的一个合作项目,需要调用统一验证接口和统一支付接口.由于牵涉公司机密,所以我要单独写一层PHP的接口给第三方用.前面那个验证接口主要卡在了des加密的方式上,这个有时间再说.这篇主 ...
- 在ASP.NET中使用SOAP Extensions捕获WebService异常
原文:在ASP.NET中使用SOAP Extensions捕获WebService异常 Application_Error不能捕获的异常 [WebMethod] public string Hello ...
- 简单对象访问协议(Simple Object Access Protocol),PHP调用SOAP过程中的种种问题;php的soap无故出错的真凶:wsdl缓存
webservice的一种常用实现方式就是soap了.我们后端的JAVA也是用soap的原理实现的.那么我显然首先要上网上搜搜关于soap的文章.最早进入实现的是PHP写的nusoap类.这个n ...
- (转)WCF中调用WebService出错,大家帮忙看看,回答就有分
http://bbs.csdn.net/topics/390542345 在WCF项目里面添加了一个WebService引用,然后在我们调用这个WCF服务时,老出错,提示在 ServiceModel ...
- SQL Server中调用WebService的实例
尊重原著作:本文转载自http://www.cnblogs.com/icycore/p/3532197.html 1.Ole Automation Procedures 服务器配置选项 当启用 OLE ...
随机推荐
- 实践一些js中的prototype, __proto__, constructor
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- HDU 2255 奔小康赚大钱 KM算法题解
KM算法求的是完备匹配下的最大权匹配,是Hungary算法的进一步,由于Hungary算法是最大匹配的算法,不带权. 经典算法,想不出来的了,要參考别人的.然后消化吸收吧. 由于真的非常复杂的算法. ...
- VMware workstation虚拟机不能联网解决方法
以备后用. 第一步:先设置VMware的编辑——虚拟网络编辑器,启用VMnet8,NAT模式,如下图所示. 其实就是VMware默认的设置,无须更改,如果不小心改了,点击还原默认设置. 第二步:虚拟机 ...
- Xamarin Mono For Android、Monotouch 安装
一.Windows下面的安装 1. 安装环境介绍: Win8.1 企业版64位或Win7 64.VS2013 update4 2. 安装jdk 到oracle官方下载jdk-8u45-wi ...
- 【POJ 3696】 The Luckiest number
[题目链接] http://poj.org/problem?id=3696 [算法] 设需要x个8 那么,这个数可以表示为 : 8(10^x - 1) / 9, 由题, L | 8(10^x - 1) ...
- [Java] 总结1.5/1.6/1.7版本的特性
开发过程中接触到了从jdk1.5---jdk1.7的使用,在不同的阶段,都使用过了jdk的一些新特性,操作起来更加方面啦!特此总结了下,以下是测试代码: JDK1.5新特性: 1.自动装箱与拆箱: I ...
- 两道人数多,课程少,query多的题
#每天进步一点点# 来两道很相似的题目~ (智商啊智商.....) hihoCoder #1236:Scores (简单的分桶法+bitset) 2015 Beijing Online的最后一题.题目 ...
- 创建我们第一个Monad
上一篇中介绍了如何使用amplified type, 如IEnumerable<T>,如果我们能找到组合amplified type函数的方法,就会更容易写出强大的程序. 我们已经说了很多 ...
- Android ToolBar标题文字居中的方法
在项目的开发中,使用苹果手机的产品,出的界面效果图极有可能(我这里是一定)完全是按照苹果的界面风格来出的,例如界面顶部的title文字位置是水平居中 如图: 那么问题来了,当我们使用ToolBar控件 ...
- sql多表关联
inner join(等值连接) 只返回两个表中联结字段相等的行 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有 ...