zoukankan      html  css  js  c++  java
  • 根据XML文档 PHP实现SOAP请求WSDL

    1.解读XML文档

    XML文档一般指可扩展标记语言。可扩展标记语言,标准通用标记语言的子集,简称XML。

    是一种用于标记电子文件使其具有结构性的标记语言。通过各个标记计算机可以实现对标记的读取和计算,并且是严格区分大小写,每一对都必须存在关闭标签。

    例子:

    <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">
       <soap:Header/>
       <soap:Body>
          <tem:WS_SingleTime>
             <!--Optional:-->
             <tem:strTagNum>PPU1_PI_9008_8</tem:strTagNum>
             <!--Optional:-->
             <tem:strTimestamp>2021-07-06 14:42:11</tem:strTimestamp>
          </tem:WS_SingleTime>
       </soap:Body>
    </soap:Envelope>
    
    

    其中:xmlns 属性可以在文档中定义一个或多个可供选择的命名空间,可在生成的时候定义和使用。对于tem则是用户生成的时候自定义的方法名称,用于在实例化soap对象后进行方法的调用。其中在tem标签中的strTagNum和strTimestamp则是其他执行方法的参数,在传递的时候以数组形式,并严格按照在xml的下标索引进行定义和赋值后进行传递。

    2.SOAP和WSDL和webservice

     * webservice的定义是Web service是创建可互操作的分布式应用程序的新平台。
       Web service 的主要目标是跨平台的可互操作性。为了达到这一目标,Web service 是完全基于XML、XSD等独立于平台、独立于软件供应商的标准的。
       Web Service实现业务诉求:Web Service是真正“办事”的那个,提供一种办事接口的统称
    
     * SOAP 提供“请求”的规范:向服务接口传递请求的格式,包括方法和参数等。
      你想让人家办事,总得告诉人家你想干什么吧,SOAP就是定义这个“请求”的格式的, 按照SOAP定义的“请求”格式“书写”请求就可以保证Web Service能够正确的解读
      你想让它干什么以及你为它提供了什么参数。在这个请求中,
      你需要描述的主要问题有:向哪个Web Service发送请求,请求的参数类型、参数值、返回值类型。这些都“填写”完毕,也就完成了符合SOAP规范的SOAP消息
    
     * WSDL提供“能办的事的文档说明”:对要提供的服务的一种描述格式。我想帮你的忙,但是我要告诉你我都能干什么,以及干这些事情需要的参数类型
    
     * SOAP调用流程:
    
        客户端:取得服务端的服务描述文件WSDL,解析该文件的内容,了解服务端的服务信息,以及调用方式。
    根据需要,生成恰当的SOAP请求消息(指定调用的方法,已经调用的参数),发往服务端。等待服务端返回的SOAP回应消息,解析得到返回值。
    
        服务端:生成服务描述文件,以供客户端获取。接收客户端发来的SOAP请求消息,解析其中的方法调用和参数格式。
    根据WSDL和WSML的描述,调用相应的COM对象来完成指定功能,并把返回值放入SOAP回应消息返回给用户。
    

    3.利用PHP实现
    PHP需要在php.ini的配置文件中开启以下扩展,否则提示soap class not found 的错误。

    php_openssl(对于https的WSDL请求需要开启,但是还是推荐开启)
    php_soap
    libxml
    
    <?php
    
    ini_set("soap.wsdl_cache_enabled", "0"); #关闭SOAP接口请求缓存
    /**
     * 发送soap查询
     * @param $params  传递参数 对应xml文档中的参数 ['strTagNum'=>'','strTimestamp'=>''] 对应第6行和第8行
     * @param string $wsdl 请求地址 $wsdl的请求URL后面要跟上wsdl表示,否则soap会出现加载失败
     * @return array
     */
    function soap($params, $wsdl="http://XXXXXXX/mes2.0release/ws_phd.asmx?wsdl"){
        header("Content-type: text/html; charset=utf-8");
        try{
            libxml_disable_entity_loader(false); #禁用加载外部实体的功能
            #trace 是否启用调试信息,true或false
            #exceptions 如果有错误发生的时候是否抛出SoapFault类型的异常。
            $client = new SoapClient($wsdl,['trace'=>1,'exceptions'=>0]);
            #执行XML文档中的WS_SingleTime方法 对应文档第4行
            $result = $client->WS_SingleTime($params);
            #将XML对象编码以后在解码为数组
            $result = json_encode($result);
            $result = json_decode($result,true);
    
            return ['code'=>200,'msg'=>'查询成功','data'=>['exist'=>$result['WS_SingleTimeResult']['Value']?1:0]];
    
        }catch (SoapFault $e){
            return ['code'=>603,'msg'=>$e->getMessage()] ;
        }catch(Exception $e){
            return ['code'=>603,'msg'=>$e->getMessage()];
        }
    }
    
    
  • 相关阅读:
    【经典】仙岛求药(一)
    6月份学习记录
    YZM的全排列
    最长公共子序列的长度
    20612统计八连块
    积木城堡
    不同组合数求和
    50136142WXY的百度地图
    50095106扔核弹
    【其他】关于海岛帝国互测系列赛总结
  • 原文地址:https://www.cnblogs.com/ikai/p/14985055.html
Copyright © 2011-2022 走看看