环境需求:
This extension makes use of theGNOME xml library. Download and install this library. You will need at least libxml-2.5.4.
Linux下,
This extension is only available if PHP was configured with--enable-soap
Windows下:
php.ini文件中extension=php_soap.dll去掉注释即可
其次:调用实践,以下是俺近期调用的算是一些总结吧
手册摘录:
SoapClient->__soapCall()
说明
class SoapClient {
mixed __soapCall ( string function_name, array arguments [, array options [, mixed input_headers [, array &output_headers]]] )
}
This is a low level API function that is used to make a SOAP call. Usually, in WSDL mode, you can simply call SOAP functions as SoapClient methods. This method useful in non-WSDL mode when soapaction is unknown, uri differs from the default or when sending and/or receiving SOAP Headers.
On error, a call to a SOAP function can cause PHP to throw exceptions or return a SoapFault object if exceptions are disabled. To check if the function call failed to catch the SoapFault exceptions, check the result with is_soap_fault().
返回值
SOAP functions may return one, or multiple values. If only one value is returned by the SOAP function, the return value of __soapCall will be a simple value (e.g. an integer, a string, etc). If multiple values are returned, __soapCall will return an associative array of named output parameters.
范例
例 1. SoapClient->__soapCall() Examples
<?php
$client = new SoapClient("some.wsdl");
$client->SomeFunction($a, $b, $c);
$client->__soapCall("SomeFunction", array($a, $b, $c));
$client->__soapCall("SomeFunction", array($a, $b, $c), NULL,
new SoapHeader(), $output_headers);
$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
'uri' => "http://test-uri/"));
$client->SomeFunction($a, $b, $c);
$client->__soapCall("SomeFunction", array($a, $b, $c));
$client->__soapCall("SomeFunction", array($a, $b, $c),
array('soapaction' => 'some_action',
'uri' => 'some_uri'));
?>
1.in WSDL mode,soapCall应用web service,例子用的是asp.net的web service,提供service.asmx页面,调用及查看都比较简单,手册上的example也大多是这个类型,比较简单
SOAP发送的协议:
POST /servicepath/service.asmx HTTP/1.1
Host: 211.186.1.4
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://211.186.5.15/Service/ServiceMethod"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ServiceMethod xmlns="http://211.186.5.15/Service">
<param1>string</param1>
<param2>string</param2>
<param3>string</param3>
</ServiceMethod>
</soap:Body>
</soap:Envelope>
调用方法:
$client = new SoapClient("http://www.xxx.com/service/service.asmx?WSDL");
//向SOAP服务方发送参数值
$param1 = "p1";
$param2 = "p2";
$param3 = "p3";
//serviceParam1,serviceParam2,serviceParam3为发送参数值所对应的参数名(或service端提供的字段名)
$param = array('serviceParam1' => $param1,'serviceParam2' => $param2,'serviceParam3' => $param3);
//方法名为ServiceMethod,参数数组为$param,默认以parameters字段标示传递的参数数组
$arr = $client->__soapCall('ServiceMethod',array('parameters' => $param));
print_r($arr);
2.in non-WSDL mode,这种情况下soapaction is unknown
SOAP发送协议
POST /services/SoapMethod?WSDL HTTP/1.1
Host: 220.211.1.12:8088
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.2.5
Content-Type: text/xml; charset=utf-8
SOAPAction: "urn:SoapMethod#ServiceMethod"
Content-Length: 1297
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:SoapMethod" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="http://220.211.1.12" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:ServiceMethod>
<ServiceMethodSection xsi:type="ns2:ServiceObjectType">
<param1 xsi:type="xsd:string">01019</param1>
<param2 xsi:type="xsd:long">10</param2>
<param3 xsi:type="xsd:long">0</param3>
<param4 xsi:type="xsd:long">11</param4>
</ServiceMethodSection>
</ns1:ServiceMethod>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
调用方法:
2.1传递一个参数:
try {
$client = new SoapClient(null,
array('location' => 'http://192.168.1.180:8088/services/SoapPage?WSDL','uri' => 'http://192.168.1.180:8088/services/'));
$result = $client->__soapCall('ServiceMethod', array('fieldName' => "data")); //以数组形式传递params
//$result = $client->__soapCall('ServiceMethod', array(new SoapParam("data", 'fieldName'))); //以构造服务端参数的形式构造参数传递给服务端
var_dump($result);
}
catch (Exception $e)
{
printf("Message = %s",$e->__toString());
}
附:手册解释
class SoapParam {
__construct ( mixed data, string name )
}
参数
data
The data to pass or return. You can pass this parameter directly as PHP value, but in this case it will be named as paramN and the SOAP Service may not understand it.
name
The parameter name
2.2传递多个参数:
如果服务端在non wsdl的情况下要求传递一个对象参数,该对象中包含多个属性,则code如下
try {
$client = new SoapClient(null, array('location' => 'http://192.168.1.180:8088/services/SoapPage?WSDL','uri' => 'urn:SoapName')); //uri部分也可能是uri地址
class Obj{
public $param1 = '01019';
public $param2 = 10;
public $param3 = 0;
public $param4 = 11;
}
$struct = new Obj(); //创建服务端要求传递的对象
//如果服务端变态到传递的参数有的参数类型是你编程语言中没有的数据类型,如本人用php,没有Java的Long类型(一般做web service都要考虑到通用性,数据类型都是string或int型,而且我认为根本没必要用Long类型。没办法服务端不改,只能我这边改)就要将参数进行强制类型转换处理,这样的处理也只是在SOAP传输中将xml的参数类型替换成服务端所要求的类型名,并不是真实转化传递的数据类型
$struct->param1 = iconv('gb2312','utf-8',$struct->param1);
$struct->param2 = new SoapVar($struct->param2,XSD_LONG);
$struct->param3 = new SoapVar($struct->param3,XSD_LONG);
$struct->param4 = new SoapVar($struct->param4,XSD_LONG);
//序列化对象中使用SoapVar的方法参考php手册对SoapVar的解释,每个参数都解释的很清楚
$soapstruct = new SoapVar($struct, SOAP_ENC_OBJECT, "ServiceObjectType", "http://soapinterop.org/xsd"); //对象序列化,注意区分,SOAP对象的序列化不是用serialize
$result = $client-> ServiceMethod(new SoapParam($soapstruct, 'ServiceMethodSection'));
//$result = $client->__soapCall('ServiceMethod', array(new SoapParam($soapstruct, 'ServiceMethodSection')));
var_dump($result);
} catch (Exception $e) {
printf("Message = %s",$e->__toString());
}
附:PEAR Manual中找到的SoapVar的解释
SoapVar
SoapVar -- Changes the Returntype of a variable
Description
new SoapVar (mixed variable, long type)
Warning
This function is EXPERIMENTAL. That means, that the behaviour of this function, the function name, in concreto ANYTHING documented here can change in a future release of this package WITHOUT NOTICE. Be warned, and use this function at your own risk.
You can change the return type of variable - so that it works better with non-PHP applications for example.
type should be one of the following
XSD_1999_TIMEINSTANT
XSD_STRING
XSD_BOOLEAN
XSD_DECIMAL
XSD_FLOAT
XSD_DOUBLE
XSD_DURATION
XSD_DATETIME
XSD_TIME
XSD_DATE
XSD_GYEARMONTH
XSD_GYEAR
XSD_GMONTHDAY
XSD_GDAY
XSD_GMONTH
XSD_HEXBINARY
XSD_BASE64BINARY
XSD_ANYURI
XSD_QNAME
XSD_NOTATION
XSD_NORMALIZEDSTRING
XSD_TOKEN
XSD_LANGUAGE
XSD_NMTOKEN
XSD_NAME
XSD_NCNAME
XSD_ID
XSD_IDREF
XSD_IDREFS
XSD_ENTITY
XSD_ENTITYS
XSD_INTEGER
XSD_NONPOSITIVEINTEGER
XSD_NEGATIVEINTEGER
XSD_LONG
XSD_INT
XSD_SHORT
XSD_BYTE
XSD_NONNEGATIVEINTEGER
XSD_UNSIGNEDLONG
XSD_UNSIGNEDINT
XSD_UNSIGNEDSHORT
XSD_UNSIGNEDBYTE
XSD_POSITIVEINTEGER
分享到:
相关推荐
1、利用SoapExtension,SoapExtensionAttribute,实现Soap自定义Attribute(标签)扩展类。 2、利用SoapHeader应用Soap扩展。 3、在写WebService时只需加认证标签,客户端调用时传入SoapHeader,即可完成认证。 4、...
【SOAP WebService简单例子】 SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在Web上交换结构化和类型化的信息。它允许服务提供者和消费者之间进行远程调用,使得分布式应用程序能够相互通信。在...
在本示例中,假设我们有一个名为`TrackingOrders`的WebService,它提供了一个名为`getOrderShippingInfo`的方法,接受订单号作为参数,返回物流信息。客户端可能如下操作: 1. 创建SOAP消息: ```xml <SOAP-ENV:...
### Java使用SOAP获取WebService实例解析 #### WebService简介 WebService是一种跨编程语言和操作系统平台的、在网络上进行数据交换的一种方式。它使用标准的Internet协议,如HTTP、XML、SOAP等来实现不同系统间的...
在这个例子中,`HelloService`是从WSDL文件生成的,`sayHello`是Web服务提供的一个方法。 总的来说,SOAP调用Web服务涉及到XML消息的构建、发送和解析,以及使用WSDL来定义和理解服务接口。尽管现在RESTful API更为...
2. **实例化SoapServer**:创建一个SoapServer对象,并将业务逻辑函数作为参数传递,这样它们就会作为SOAP服务的方法暴露出去。 3. **设置命名空间和WSDL**:WSDL(Web Services Description Language)是SOAP服务的...
在IT行业中,Web服务是应用程序之间进行通信的一种标准方式,而SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于交换结构化的、机器可读的数据。SOAP WebService调试工具是开发人员用来测试、验证和...
标题中的“PB9-soap-WEBSERVICE例子.rar”表明这是一个关于PowerBuilder 9(简称PB9)使用SOAP(简单对象访问协议)调用Web服务的示例压缩包。这个例子可能包含完整的代码、配置文件以及相关的说明文档,用于演示...
本文档中提到的例子涉及到了一个基于股票市场交易信息的WebService,其中一项功能就是返回某一天内所有股票的总交易量。 服务名为`urn:BasicTradingService`,包含了一个名为`getTotalVolume()`的方法,该方法接收...
下面是一个基于.NET实现SOAP Header和SOAP Extensions的Web服务示例: 首先,我们定义一个自定义的SOAP Header类,比如`CustomSoapHeader`,它继承自`SoapHeader`。这个类可以包含我们需要在Header中传递的属性,如...
如果验证失败,服务会抛出一个SOAP错误。 此外,学习和实践PHP Web服务,你可以参考提供的"PHPwebservice"压缩包文件,它可能包含了一系列的示例代码、教程文档或其他资源,帮助你更好地理解和应用上述概念。 总的...
在本文中,我们将使用 C# 语言在 Winform 平台下开发一个应用程序,该应用程序将使用 WebService Soap 技术来实现列车时刻、手机归属、QQ 在线、航空时刻等查询工具。 MobileWebService MobileWebService 是一个...
根据提供的文件信息,本文将详细解释一个简单的 WebService 示例,并深入探讨其中的关键概念和技术细节。 ### 一、WebService 概念 #### 1.1 WebService 定义 WebService 是一种支持通过网络进行调用的服务形式,...
1. **SOAP消息结构**:一个SOAP消息通常包含三个主要部分:Header、Body和Envelope。Header包含了与消息处理相关的元数据,如安全信息或路由信息。Body是消息的核心,包含实际的业务数据。Envelope则包围整个消息,...
总的来说,Web服务和SOAP调用是分布式系统中实现互操作性的重要手段,而积分接口则是一个具体的业务应用场景,它让不同的系统可以通过统一的标准进行数据交互,例如在电商平台中实现用户积分的管理和转移。...
参考了下载的一个小例子,然后亲自配置环境,并写了测试代码 其中index为使用说明和测试链接。 本方法使用了phpStudy自带的php_soap.dll,不需要下载任何插件,只需要在phpStudy的菜单中打勾php_soap(见压缩包中的...
PHP使用SOAP调用WEBSERVICE接口
在这个案例中,我们将深入探讨Qt如何与SOAP交互以及如何构建一个简单的Webservice应用。 首先,`qsoapman-0.4`可能是一个开源项目或库,用于简化Qt中处理SOAP消息的过程。这个版本可能是项目的稳定版,包含了实现...
本资源提供了一个较为完整的Webservice实现案例,它可以帮助我们深入理解Web Service的工作原理以及如何在实际项目中应用。 【描述】:“NULL” 尽管描述为空,但我们可以从标题推测,这个压缩包可能包含一个或多...
最近写了一个SOA服务,开始觉得别人拿到我的服务地址,然后直接添加引用就可以使用了,结果"大牛"告知不行。...让我写一个SOAP调用服务的样例,我有点愣了,因为没做过这方面的,于是搞到了一个Demo,然后学习了下。