php提供service总结---wsdl篇

越来越多的架构偏向于面向接口和面向服务的设计了,当我们把抽象的落地变为实际的时候,我们感觉到了代码的厚度。而当我们把具体的业务再进一步抽象,我们就能发现藏在细节深处的回馈。

php可以提供service,利用一些契约(或者说协议)来进行通信和交换数据。常用的有soap,rpc,restful api(json传输为主流)等方式。我在jm的时候,曾经用过thrift写的接口,给java组的童鞋提供数据接口。thirift让不同编程语言的项目可以很好协调在一起,形成的文档也较为清晰,但是毕竟又借用了三方的东西,增加维护成本和学习成本。

关于restful api,我是非常喜欢的。基于资源的设计,清晰无比的请求方式(get,put,post,del),加上json友好的格式化数据传递,有点大道至简的禅味。我手里正在做的一个私人项目,就是基于这种方式写的。restful api要聊的太多了,不过不是我今天要谈的,还是聊聊 soap吧。

简单说,soap是基于XML的交换数据的协议。因为是xml映射数据关系,所以不在乎是什么编程语言或者平台(其实我更喜欢json方式,更纯粹)。

php在实现soap的方式有两种,一种是wsdl方式,一种是无wsdl方式。今天我只谈wsdl方式。

实现原理如我整理之图所示:

soap分为server端和client端,server端运行起来之后一直handle,然后client端利用生成好的wsdl文件规则,去注册使用server端的接口,获取返回数据(xml之类的).

类比java中的socket编程,也是client去监听server,server一直阻塞等待调用。

代码如下。

server parts:

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2015/12/3
 * Time: 16:44
 */
class Server {
    /**
     * 获取用户列表
     *
     * @return mixed
     * @author freephp at 2015-12-3
     */
    function userList() {
        $data = $this->user_model->find();
        return $data;
    }

    /**
     * 获取派对列表
     *
     * @return array
     * @author freephp at 2015-12-3
     */
    function partyList() {
        // some codes to do
        return array(
            'party_name' => 'cn',
            'history' => 1995
        );
    }
}

try {
    $soap = new SoapServer("server.wsdl"); // new一个SoapServer对象出来,此为php标准库里对象
} catch (Exception $e) {
    echo $e->getMessage();die();
}     //This uri is your SERVER ip.

$soap->setClass("Server"); 

$soap->handle(); // handle it

client端代码如下:

<?php
/**
* client调用.加了很多调试try,catch.
**/ try { $client = new SoapClient(null, array( 'location' => self::$serverUrl, 'uri' => self::$uri, ) ); } catch (Exception $e) { // print the error info echo $e->getMessage(); die(); } try { $data = $client->useList(self::$verifyID, $xml); } catch (SoapFault $ex) { // 调试打印出错误堆栈和最后一次请求信息 print $ex->getMessage(); print $ex->getTraceAsString(); echo $client->__getLastResponse(); echo $client->__getLastResponseHeaders(); die(); }

 在编写过程中,我遇到许多不同报错,比如 VersionMismatch,not xml等。

出现VersionMismatch的时候要先检查一下你client端传的xml的version是和server端的一致。soap有两个版本,1.1和1.2。必须设置成同一种。这就像和歪果仁聊天一样,大家沟通的语言要一致,不然没辙。然而我遇到这个报错的原因却因为我在server端打了调试信息,让server返回的不是xml数据,自然就报错了。所以请调试的时候一定要在 client这边调用完成后打印。

原文地址:https://www.cnblogs.com/freephp/p/5016929.html