2017-10-17 85 views
2

我與PHP的SOAP的lib開始申請文件到PHP函數調用,我無法弄清楚如何執行我的要求:SOAP PHP:如何翻譯

該服務器有一個用戶友好的API,它給我的要求通過,但我不能告訴我該怎麼做。

這是我目前的點:

$soap = new SoapClient("https://www.dmc.sfr-sh.fr/DmcWS/1.5.6/MessagesUnitairesWS?wsdl"); 

$soap->getSingleCallCra(); 

,並要求我應該通過:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://servicedata.ws.dmc.sfrbt/"> 
<soapenv:Header> 
    <ser:authenticate> 
    <serviceId>********</serviceId> 
    <servicePassword>******</servicePassword> 
    <spaceId>*******</spaceId> 
    <lang>fr_FR</lang> 
    </ser:authenticate> 
</soapenv:Header> 
<soapenv:Body> 
    <ser:getSingleCallCra> 
    <beginDate>2017-10-17T00:00:00</beginDate> 
    </ser:getSingleCallCra> 
</soapenv:Body> 
</soapenv:Envelope> 

的SOAP客戶端不與任何參數等功能的工作,但我得到一個翻譯的java當我調用這個函數時NPE異常。

任何人都可以告訴我如何將參數和認證傳遞給函數嗎?

謝謝。

回答

3
$soap = new SoapClient("https://www.dmc.sfr-sh.fr/DmcWS/1.5.6/MessagesUnitairesWS?wsdl"); 

要頭添加到的SOAPCall使用__setSoapHeaders方法是這樣的:

$soap->__setSoapHeaders(array(
    //(namespace, name, data) 
    new SoapHeader("http://servicedata.ws.dmc.sfrbt/",'authenticate',array(
    'serviceId' => '********', 
    'servicePassword' => '******', 
    'spaceId' => '*******', 
    'lang' => 'fr_FR', 
)) 
)); 

這些參數將進入皁體。在PHP中,您可以使用對象或關聯數組作爲輸入,因爲它們都以鍵=>值對的形式解釋爲xml。

$soap_body_parameters = array(
    'beginDate' => '2017-10-17T00:00:00', 
); 

$response = $soap->getSingleCallCra($soap_body_parameters); 

print_r($response); 

SoapClient類外的返回值始終是一個對象,所以記得要使用箭頭符號「$對象 - >屬性」來獲得相關的數據出來。

您也可以在後臺創建這樣一個類,將處理頭,數據提取等每個呼叫

class sfr_soap { 
    function __construct($serviceId, $servicePassword, $spaceId, $lang = 'fr_FR'){ 
    $url = "https://www.dmc.sfr-sh.fr/DmcWS/1.5.6/MessagesUnitairesWS?wsdl"; 
    $this->client = new SoapClient($url); 
    $soap->__setSoapHeaders(array(
     new SoapHeader("http://servicedata.ws.dmc.sfrbt/",'authenticate',array(
      'serviceId' => $serviceId, 
      'servicePassword' => $servicePassword, 
      'spaceId' => $spaceId, 
      'lang' => $lang, 
     )) 
    )); 
    } 
    public function __call($name, $args = array()){ 
    $response = $this->client->$name($args); 
    // do something with the response here, like extract the meaningful parts of the data 
    return $response; 
    } 
} 

初始化這樣

$sfr = new sfr_soap($serviceId, $servicePassword, $spaceId); 

或類似這個如果你想指定語言

$sfr = new sfr_soap($serviceId, $servicePassword, $spaceId, $lang); 

使用像這樣

$data = $sfr->getSingleCallCra(array(
    'beginDate' => '2017-10-17T00:00:00' 
)); 
+0

謝謝你使用__setSoapHeaders()這個語法。事實上,我想最好是在擴展類的構造函數中調用它。 – GdC

1

您可以傳遞參數,因爲它是在文檔中規定一個SOAP函數調用多種方式:SoapClient::__soapCall

的的參數數組傳遞給函數。這可以是一個有序數組或關聯數組。請注意,大多數SOAP服務器都需要提供參數名稱,在這種情況下,這必須是關聯數組。

所以你的情況,調用應該是:

$soap->getSingleCallCra(array(
    'beginDate' => '2017-10-17T00:00:00', 
)); 

我希望,我可以幫上什麼忙。

+0

是的,我認爲,但這並沒有解決問題。是否有可能是部分可能是問題? – GdC

+0

你能提供錯誤訊息?這可能有助於解決您的問題。 – Derenir

+0

錯誤消息是「java.lang.NullPointerException」(NPE),因爲SOAP服務器基本上會拋出java消息。順便說一句,通過將正確的標頭傳遞給請求來解決問題。 – GdC