首页 理论教育版本的WSDL文件-PHP MVC开发实战

版本的WSDL文件-PHP MVC开发实战

【摘要】:在PHP中,SOAP扩展模块只能解释WSDL文件,这也是W3C所规范的文件类型。事实上WSDL并非唯一的SOAP文档模型,在其他平台中出于商业需要,各厂商会进行相应的功能定制,文件名称也不尽相同,例如ASP.NET平台就叫ASMX。图12-3 WSDL文档模型如图12-3所示,这些节点描述信息并非全是必选的,下面将通过一个示例代码,简单演示SOAP的应用。接下来将对WSDL中重要的节点元素进行讲解。

在PHP中,SOAP扩展模块只能解释WSDL文件,这也是W3C所规范的文件类型。事实上WSDL并非唯一的SOAP文档模型,在其他平台中出于商业需要,各厂商会进行相应的功能定制,文件名称也不尽相同,例如ASP.NET平台就叫ASMX。

但不管怎样叫法,由于WSDL遵循国际化规范,所以在这些平台上使用WSDL是完全通用的。WSDL由definitions、types、message、binding、service等节点组成,分别代表不同的描述信息,如下所示。

➢types(消息类型):可选,数据类型定义的容器,它使用某种类型系统(如XSD)。

➢message(消息):必选,通信数据的抽象类型化定义,它由一个或者多个part组成。

➢part:必选,消息参数。

➢operation(操作):必选,对服务所支持的操作进行抽象描述。

➢port Type(端口类型):必选,特定端口类型的具体协议和数据格式规范。

➢binding(通信类型绑定):必选,描述通信的类型,例如SOAP。

➢service(服务描述):必选,相关端口的集合,包括其关联的接口、操作、消息等。

➢port(服务列表):必选,定义为绑定和网络地址组合的单个端点。

其中operation操作分为4种类型,分别为one-way(单向)、request-response(异步请求异步返回)、solicit-response(要求应答)、notification(通知)。WSDL最外层元素是definitions,在该元素下定义其他节点描述信息。如图12-3所示。

978-7-111-42852-7-Part02-686.jpg

图12-3 WSDL文档模型

如图12-3所示,这些节点描述信息并非全是必选的,下面将通过一个示例代码,简单演示SOAP的应用。假设使用http://c1.localhost作为Web Service服务端,使用http://c2.localhost作为客户端,那么在服务端中需要创建消息实体类。首先创建绑定接口文件,并命名为api.php,代码如下。

978-7-111-42852-7-Part02-687.jpg(www.chuimin.cn)

978-7-111-42852-7-Part02-688.jpg

对应的Data.class.php文件为消息类体文件,代码如下所示。

978-7-111-42852-7-Part02-689.jpg

上述代码功能很简单,只需要根据客户端提交的邮政编码,返回相应的城市。在实际应用开发中,这些数据可以直接在数据库中获取。前面在api.php文件中已经将api.wsdl绑定为消息类体描述文件,所以需要在同级目录下创建api.wsdl文件,代码如下。

978-7-111-42852-7-Part02-690.jpg

978-7-111-42852-7-Part02-691.jpg

如上述代码所示,types节点定义了消息的数据类型(上传及返回)。PHP目前只支持string、int、float等常见数据类型。这里的数据类型与PHP中的数据类型不是一个概念,而是W3C定义的数据类型。也就是说在此定义的数据类型无论在哪种语言或技术中,都能够转换为该语言对应的数据类型。对于PHP而言,由于PHP对数据类型不敏感,所以意义不大(例如可以使用string代替int)。

至此,一个简单的SOAP服务端就创建完成了。接下来在http://c2.localhost网站中创建客户端,代码如下所示。

978-7-111-42852-7-Part02-692.jpg

运行结果为“广州市”。可以看到,在客户端中并不是调用api.php文件,而是调用api.wsdl文件。api.wsdl文件是一个XML格式的数据描述文件,并没有脚本处理能力。但由于将其与api.php文件绑定,所以api.wsdl文件就拥有了api.php所拥有的功能了,在使用时与在本地直接调用api.php文件保持一致,这就是分布式开发的典型应用。

需要注意的是,由于PHP对数据类型不敏感,所以对调用的结果并不会进行强类型检测,这往往会造成严重问题。

例如在WSDL中定义了array类型数据,在调用时PHP可以使用array类型传参数给远程接口。但使用其他语言时(例如C#、Java)将会造成严重的错误。这是因为PHP对WSDL的支持是严格按照W3C规范所设计的,而该规范中并未将数组类型作为SOAP标准数据类型(需要额外引入另外一组命名空间)。

所以强制将节点中的string改为array时,PHP能正常识别为数组类型,但其他强类型语言则不能识别。解决办法是尽量使用W3C规范的标准数据类型,例如可以将数组序列化为Json,然后以字符串的形式传参。

接下来将对WSDL中重要的节点元素进行讲解。理解这些节点的作用及意义,是掌握SOAP应用开发的前提。首先从definitions元素开始介绍。