根据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); #关闭 禁用加载外部实体的功能,此功能默认是开启, 如开启会出现 Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 失败的错误
        #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()];
    }
}

posted @ 2021-07-08 10:45  青柚  阅读(822)  评论(0编辑  收藏  举报