1. 程式人生 > 其它 >根據XML文件 PHP實現SOAP請求WSDL

根據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

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()];
    }
}