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()];
        }
    }
    
    
  • 相关阅读:
    [JSOI2007][BZOJ1031] 字符加密Cipher|后缀数组
    leetcode Flatten Binary Tree to Linked List
    leetcode Pascal's Triangle
    leetcode Triangle
    leetcode Valid Palindrome
    leetcode Word Ladder
    leetcode Longest Consecutive Sequence
    leetcode Sum Root to Leaf Numbers
    leetcode Clone Graph
    leetcode Evaluate Reverse Polish Notation
  • 原文地址:https://www.cnblogs.com/ikai/p/14985055.html
Copyright © 2011-2022 走看看