php soap 调用webservice应用测试

一、寻找WebService来源

WebService可以自己编写,但是也可以从网络上去寻找现成的。我用的是www.xmethods.net里的US Zip Validator。它的WSDL文件位置在:http://www.webservicemart.com/uszip.asmx?WSDL。 它的作用是根据输入的ZIP代码,返回该代码对应的美国地名,州名,经纬度等。

二、创建SoapClient

第二步就是创建SoapClient,并调用WebService中的方法,并获得返回值。PHP代码如下

二、创建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。于是,我们就解释了前两节提出的问题:

•怎样找到要调用的函数?
•怎样知道函数的参数、类型?
•怎样得到函数的返回值?

例2,

这里我们使用php5自带的类来操作

我的结构如下:在 webservice 文件夹下有如下三个文件:Personinfo.php,SoapClient.php,SoapServer.php,具体作用可以参照代码中的注释。

 代码如下 复制代码

<?php
/**
* Personinfo.php
* 此类包含了需要调用的方法
* @author itbdw
*
*/
class Personinfo {

/**
* 返回姓名
* @return unknown_type
*/
public function getName() {
return ‘IT不倒翁’;
}

/**
* 返回特定格式的日期
* @return unknown_type
*/
public function getTime() {
return date(‘Y-m-d’);
}

}

 代码如下 复制代码

<?php
/**
* SoapServer.php
* webservice 服务器端实例
*/
//包含提供服务的类
require_once ‘Personinfo.php’;

//根据实际情况修改下行内容
$s = new SoapServer(null, array("location" => "http://zby/webservice/SoapServer.php", "uri" => "SoapServer.php"));

$s->setClass("PersonInfo");

$s->handle();
[/php]
[php]
<?php
<?php
/**
* SoapClient.php
* webservice 客户端实例
*/

header(‘Content-Type:text/html;charset=utf-8′);

try {

//根据实际情况修改下行内容
$soap = new SoapClient(null, array(‘location’=>’http://zby/webservice/SoapServer.php’, ‘uri’=>’SoapServer.php’));

echo $soap->getName();
echo $soap->getTime();

} catch(SoapFault $e) {
echo $e->getMessage();
} catch(Exception $e) {
echo $e->getMessage();
}

时间: 2024-08-03 09:28:23

php soap 调用webservice应用测试的相关文章

java如何通过soap调用webservice接口【No Deserializer found to deserialize】

问题描述 publicstaticStringgetService(){URLurl=null;try{url=newURL("http://XXX.XXX.XXX.XXX/aaa/services/MailCsService");}catch(MalformedURLExceptionmue){returnmue.getMessage();}//ThisisthemainSOAPobjectCallsoapCall=newCall();soapCall.setEncodingStyl

js调用webservice构造SOAP进行身份验证_javascript技巧

本文实例为大家分享了js调用webservice构造SOAP进行身份验证的相关内容,注释清除,供大家参考,具体内容如下 <html> <head> <title>无标题页</title> <script language="javascript" type="text/javascript"> // <!CDATA[ //define var xmlhttp; var value=new Array(

如何用IOS调用WebService(SOAP接口)_IOS

在一次项目开发过程中,用到IOS调用WebService接口,所以抽个空把这方面的内容给大家整理出来,分享给大家. 方法一:使用WSDL2ObjC工具,将接口转成OC类. 1.在浏览器中输入webService接口地址(Safari不可用,我用的是Firefox),如:http://xxx.xxx.asmx, 地址后面添加上.wsdl成http://xxx.xxx.asmx.wsdl打开. 2.将页面另存为wsdl文件,保存的时候后缀加上.wsdl,保存成如xxxxService.asmx.xm

调用webservice

利用webservice查询手机号码归属地 实现方法: Android客户端可以通过在Http的基础上使用SOAP调用webservice服务器上的API 第一步:在src下新建一个xml文件. (1)从网站http://WebXml.com.cn/找到需要的API (2)把从网上拷贝的API即soap协议粘贴进刚才新建的xml文件 (3)注意:在xml中使用占位符$mobile来代替还未输入的手机号码 soap.xml文件如下: <?xml version="1.0" enco

php soap调用asp.net webservice

原文:php soap调用asp.net webservice 首先做一下准备工作,找到安装环境里的php.ini把;extension=php_soap.dll去掉前面的;.我这里使用的是wamp,php-php扩展里把php_soap启用就可以了. 一.用vs2008新建一个webservice:using System;using System.Linq;using System.Web;using System.Web.Services;using System.Web.Services

DOMINO 8.5调用WEBSERVICE SOAP 头的问题

问题描述 我用DOMINO8.5编辑器也是8.5的,调用WEBSERVICE,其中WEBSERVICE有SOAP头验证信息.我在网上查看了可以直接lotus.domino.websvc.client.Call_call=createCall("getOUlist");但是我在createCall的时候老是出错,并且在WEBSERVICE使用者里面已经建立好XXXStub.JAVA文件.文件内容如下:packagecom.WebAD;publicclassSyncADSoapStubex

web service-jax-ws调用webService返回结果为json,使用拼装soap调用返回信息转义了

问题描述 jax-ws调用webService返回结果为json,使用拼装soap调用返回信息转义了 返回json:{"loginName":"admin1","msg":"return success","ret":"0"} 以下是调用方法: public static String callWS(String SOAPUrl, String body) throws Exceptio

php 用自带soap扩展调用webservice。老是报错cannot load from。。

问题描述 php 用自带soap扩展调用webservice.老是报错cannot load from.. 我用的wamp2.5集成环境,php里面的soap扩展也都打开了.却一直无法成功调用webservice,总是报cannot load from的错误. 刚刚卸载了wamp2.5.装了一个wamp2.4,还是不成功,后来又重新安装了wamp2.5,重启了一下电脑,突然就能调用webservic 了.太郁闷了,有大神遇到过同样的问题么. 解决方案 灵异事件经常会碰到,原因神马的已经不重要了,

asp.net中 GET/POST/SOAP方式调用WebService实现方法

GET与POST区别 HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST(Ajax开发,关心的只有GET请求和POST请求). GET与POST方法有以下区别: (1)   在客户端,Get方式在通过URL提交数据,数据在URL中可以看到:POST方式,数据放置在HTML HEADER内提交. (2)   GET方式提交的数据最多只能有1024字节,而POST则没有此限制. (3)   安全性问题.正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Po