2010-09-21 56 views
3

這裏是我試圖撥打電話:從切換到的NuSOAP PHP5香皂 - 需要在JumpStart

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Header xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <urn:SessionHeader xmlns:urn="http://www.mywebservice.com/webservices/SoapService" xmlns="http://www.mywebservice.com/webservices/SoapService" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
     <urn:sessionId xmlns:urn="http://www.mywebservice.com/webservices/SoapService">LOGINTOKEN=your instance name</urn:sessionId> 
    </urn:SessionHeader> 
</soap:Header> 
<soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <ns2:login xmlns:ns2="http://www.mywebservice.com/webservices/SoapService"> 
     <wsUser> 
      <entityId>0</entityId> 
      <password>your password</password> 
      <username>your username</username> 
     </wsUser> 
    </ns2:login> 
</soap:Body> 

但我有麻煩找出如何設置自定義首部中PHP5的肥皂。使用nuSoap,我可以將整個事物放入一個變量中,然後使用$client->setHeader($headerVar),但我在PHP中找不到任何類似的東西。如果我能複製這一個電話,我可以找出其他的問題。任何幫助,將不勝感激!

在此先感謝!

更新:我已經通過教程後的教程,並閱讀PHP文檔,但似乎沒有任何工作。我可以用curl(以及nuSoap)來做我想做的事情,但我認爲原生的PHP5 Soap會更容易,也更穩定。我想不是...

更新2 這裏有我想要的代碼:

$soapurl = 'http://www.mywebservice.com/webservices/SoapService?wsdl'; 
$client = new SoapClient($soapurl,array('trace'=>true)); 
$token = "LOGINTOKEN=your instance name"; 

$header = new SoapHeader('http://www.mywebservice.com/webservices/SoapService', 'SessionHeader', array('sessionId' => $token)); 
$client->__setSoapHeaders($header); 


$client->login(array("wsUser" => array('entityId'=>'0','username'=>'my username','password'=>'my password'))); 

和錯誤,我得到:

**Fatal error**: Uncaught SoapFault exception: [ns1:InvalidSecurity] An error was discovered processing the <wsse:Security> header in C:\www\soap\index.php:12 Stack trace: #0 C:\www\soap\index.php(12): SoapClient->__call('login', Array) #1 C:\www\soap\index.php(12): SoapClient->login(Array) #2 {main} thrown in C:\www\soap\index.php on line 12 

更新3 所以看起來像「sessionId」被髮送爲「密鑰」,令牌作爲「值」發送。

*REQUEST*: 
    <?xml version="1.0" encoding="UTF-8"?> 
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.mywebservice.com/webservices/SoapService"> 
<SOAP-ENV:Header> 
<ns1:SessionHeader><item><key>sessionId</key><value>LOGINTOKEN=my token</value></item> 
</ns1:SessionHeader> 
</SOAP-ENV:Header> 
<SOAP-ENV:Body><ns1:login><wsUser><entityId>0</entityId><password>my password</password><username>my username</username></wsUser></ns1:login></SOAP-ENV:Body></SOAP-ENV:Envelope> 
+0

SoapClient :: __ setSoapHeaders()不做你想要的東西? http://php.net/soapclient.setsoapheaders – Inigoesdr 2010-09-22 04:56:34

+0

它可能,我已經嘗試過實現它,但我無法弄清楚如何使它返回確切的格式。 – TerryMatula 2010-09-24 14:15:27

回答

2

你試過SoapHeader類來構造你的頭?會有這樣的工作嗎?

//Assume $token holds your login token and $client holds the SoapClient object 
$header = new SoapHeader('http://www.mywebservice.com/webservices/SoapService', 'SessionHeader', array('sessionId' => $token)); 
$client->__setSoapHeaders($header); 

這應該創建標題並將其添加到SoapClient。隨後使用SoapClient進行的每個後續調用都將具有該標題集。至於確切的格式,我不會太擔心。您在示例XML中使用名爲urn的名稱空間的別名。 PHP可能不會到達完全相同的別名,但它仍然可以工作。另外我不認爲需要在每個子元素中聲明xmlns。我認爲一個子節點會自動繼承其父代的XML名稱空間,但我不是100%確定的。底線是,只要在命名空間中聲明瞭正確的URL,即使XML與您的示例不完全匹配,它也應該沒問題。

你可以嘗試的另一件事 - 你打開SoapClient中的跟蹤?這是可以傳遞給構造函數的參數之一,它使您能夠查看XML SOAP請求和響應。如果它仍然無法使用SoapHeader類,請嘗試切換跟蹤以查看正在發送和接收的內容。

+0

無法正常工作。我收到一個「Uncaught SoapFault例外」。請參閱我的編輯以獲取更多信息... – TerryMatula 2011-02-14 20:31:44

+0

如果服務的Soap Response包含錯誤(soap故障),則會拋出SoapFault。你能捕捉到異常並訪問錯誤信息嗎?它可能會給你一些有關正在發生的事情的有價值的信息。也請嘗試打開跟蹤並轉儲正在發送和接收的XML。你可以回覆完成後,我會看看我是否可以考慮任何其他建議。 – Jeremy 2011-02-14 20:37:15

+0

只是提交了一個編輯問題。謝謝您的幫助。 – TerryMatula 2011-02-14 20:39:25