php webservice,php自带SOAP扩展一个简单例子
提起php调用web service,在php4年代的人会立即想到用nusoap调用,这个nusoap是个好东东,不过年久未更新,恐其中会有众多漏洞了,正好已经进入了php5年代了,调用web service用自带的扩展岂不快哉!
前提:打开php5的web service扩展
环境需求:
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
分享到:
相关推荐
在IT行业中,PHP是一种广泛使用的服务器端脚本语言,尤其在构建动态网站和Web服务方面。SOAP(简单对象访问协议)则是一种轻量级的...这个项目提供了一个实际操作的起点,你可以在此基础上扩展和定制自己的SOAP应用。
4. **HTTP和HTTPS**: SOAP通常基于HTTP/HTTPS传输,理解这些协议的基础知识对于调试和优化SOAP通信至关重要。 5. **命名空间(Namespaces)**: SOAP消息中经常涉及到XML命名空间,理解如何正确处理和使用它们是必要...
一、SOAP协议基础 1. SOAP消息:SOAP消息以XML格式编码,包含三个主要部分:Header、Body和Envelope。Header用于传递元数据,Body是消息的核心,包含实际的数据,而Envelope则包围整个消息,定义其结构。 2. SOAP...
WSDL和SOAP基础概念 WSDL(Web Services Description Language)是XML格式的描述语言,用于描述网络服务的接口、消息格式以及协议绑定。它允许开发者理解网络服务的细节,包括服务做什么以及如何与之交互。WSDL文件...
提供了一个使用PHP语言与Google的SOAP(Simple Object Access Protocol)搜索API交互的实现。SOAP是一种用于交换结构化和类型化信息的协议,它允许不同系统之间进行通信,即使它们运行在不同的操作系统或编程语言上...
2. **SOAP**:理解SOAP的基础知识至关重要,包括其XML格式、消息结构(请求和响应)、WSDL(Web Services Description Language)定义服务以及如何在PHP中使用SOAP客户端库(如SoapClient类)来发送和接收SOAP消息。...
【描述】:本项目旨在设计并实现一个基于SOAP协议的PHP网络电台索引服务,利用面向服务的架构(SOA)理念,结合富互联网应用(RIA)技术,提供网络电台查询和播放功能。通过使用NuSOAP扩展在服务器端创建服务,并...
SOAP(Simple Object Access Protocol)是一种轻量级的、基于XML的协议,用于在不同网络应用之间交换结构化和类型化的信息。Web Service则是利用SOAP和HTTP等标准协议实现的一种分布式计算模型,允许不同的系统通过...
在IT行业中,Web服务是一种允许不同应用程序之间进行通信和数据...无论是开发自己的Web服务还是集成现有的服务,这些知识都是非常基础且重要的。通过学习和实践这个例子,开发者可以更好地掌握PHP在Web服务中的应用。
PHP 简介: 介绍 PHP 编程语言的基础知识和语法,以及如何在 PHP 中编写 Web 服务。 RESTful API 设计: 深入探讨如何设计和实现符合 REST 架构风格的 API,包括资源、URI 设计、HTTP 方法等。 SOAP 服务: 讨论...
部分内容提到了教程的前提条件,包括对PHP5基础知识的理解,以及如何安装和配置PHP SOAP扩展。此外,它还指出了系统要求,包括任何Web浏览器、HTTP服务器以及支持WSDL(Web服务描述语言)和SOAP over HTTP的服务器,...
中文手册详尽地介绍了这些基础知识,帮助初学者快速入门。 **2. 数据类型** PHP5引入了对象和引用的概念,以及弱类型的特性。除了传统的字符串、整型、浮点型、布尔型和数组外,还增加了对象、资源和NULL等类型。...
全书共分27章,包括初识.PHP、PHP环境搭建和开发工具、PHP语言基础、流程控制语句、字符串操作、正则表达式、PHP数组、PHP与Web页面交互、PHP与JavaScript交互、日期和时间、Cookie与Session、图形图像处理技术、...
总的来说,这个项目涵盖了PHP基础、网络请求、API接口交互、数据解析、错误处理、数据库操作以及前端异步请求等多个方面,是学习和实践PHP全栈开发的一个实例。通过研究这个源码,开发者可以深入理解如何用PHP构建一...
CakePHP与Jira SOAP客户端的使用涉及到集成Jira的RESTful API来在PHP环境下创建和管理Jira项目中的Issue。Jira是一个广泛使用的项目管理工具,支持敏捷开发,提供问题追踪、任务管理和项目管理功能。SOAP和REST是两...
这份手册首先介绍了PHP的基础知识,包括安装与配置环境、PHP脚本的基本结构以及如何在服务器上运行PHP程序。其中,变量的声明、数据类型(如整型、浮点型、字符串、布尔型、数组、对象等)、常量与标量、运算符、...
通过阅读《PHP经典实例 第3版》,读者不仅可以掌握PHP编程的基础知识,还能学习到如何解决实际项目中的问题,从而成为一名熟练的PHP开发者。书中的样章部分通常会展示部分内容,让潜在读者了解书中的风格和深度,...
由于这里提到了“黑客派”,这是一个知名的开源技术社区,可能是使用了Symphony CMS作为其基础架构,结合了Java技术和SOAP QBL来提供更高效的服务。 在这个项目中,Symphony CMS可能被用来管理用户生成的内容,如...
学习《PHP中文手册CHM》,不仅可以掌握PHP的基础知识,还能了解高级特性和最佳实践,提升开发效率,减少出错概率。而“藏经阁资源站.url”可能是为了提供额外的在线资源或社区支持,进一步辅助学习者深化理解并解决...
了解这些基础知识是进行PHP编程的基石。 2. **函数库** PHP5包含了丰富的内置函数,如字符串处理函数、数组操作函数、日期时间处理函数、文件系统函数等。手册详细列出了每个函数的用法、参数、返回值和例子,方便...