根據XML文件 PHP實現SOAP請求WSDL
阿新 • • 發佈:2021-07-08
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()]; } }