• 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这边调用完成后打印。

  • 相关阅读:
    法院
    Spring Cloud常用组件
    PowerShell使用教程
    浅谈3DES加密解密
    SC win consul
    SB-Token-Jwt
    前端MVC Vue2学习总结
    spring-session-data-redis
    SpringBoot WS
    SpringBoot之使用Spring Session集群-redis
  • 原文地址:https://www.cnblogs.com/freephp/p/5016929.html
Copyright © 2020-2023  润新知