2014-06-16 42 views
1

請求XMLPHP SOAP請求使用WCF與頭和XML主體

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
<s:Header> 
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://schemas.navitaire.com/WebServices/ISessionManager/Logon</Action> 
<h:ContractVersion xmlns:h="http://schemas.navitaire.com/WebServices">330</h:ContractVersion> 
</s:Header> 

<s:Body> 
<LogonRequest xmlns="http://schemas.navitaire.com/WebServices/ServiceContracts/SessionService"> 
    <logonRequestData xmlns:d4p1="http://schemas.navitaire.com/WebServices/DataContracts/Session" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <d4p1:DomainCode>WWW</d4p1:DomainCode> 
    <d4p1:AgentName>API****</d4p1:AgentName> 
    <d4p1:Password>********</d4p1:Password> 
    <d4p1:LocationCode i:nil="true" /> 
    <d4p1:RoleCode>APIB</d4p1:RoleCode> 
    <d4p1:TerminalInfo i:nil="true" /> 
    </logonRequestData> 
</LogonRequest> 
</s:Body> 
</s:Envelope> 

的WSDL和其他模式只能從特定的IP所以我在http://pastie.org/9263788

在這裏張貼的內容進行訪問該LogonRequest元素都可以在這裏找到pastie.org/9290170

而且下面是代碼,我已經試過

$wsdl = 'https://trtestr3xapi.navitaire.com/sessionmanager.svc?wsdl'; 

$client  = new SoapClient($wsdl, array("trace" => 1, "exception" => 0)); 

$header = new SoapHeader('http://schemas.navitaire.com/WebServices','ContractVersion','330', '1'); 
$client->__setSoapHeaders($header); 

$ns_d4p1 = 'http://schemas.navitaire.com/WebServices/DataContracts/Session'; 
$ns_i = 'http://www.w3.org/2001/XMLSchema-instance'; 

$logonResquestData = new SimpleXMLElement("<logonRequestData xmlns:i='$ns_i' xmlns:d4p1='$ns_d4p1' />"); 

$logonResquestData->addChild('d4p1:DomainCode', 'WWW', $ns_d4p1); 
$logonResquestData->addChild('d4p1:AgentName', 'AgentName', $ns_d4p1); 
$logonResquestData->addChild('d4p1:Password', 'Pass****', $ns_d4p1); 
$logonResquestData->addChild('d4p1:LocationCode', null, $ns_d4p1)->addAttribute('i:nil', 'true', $ns_i); 
$logonResquestData->addChild('d4p1:RoleCode', 'APIB', $ns_d4p1); 
$logonResquestData->addChild('d4p1:TerminalInfo', null, $ns_d4p1)->addAttribute('i:nil', 'true', $ns_i); 


$logon_request = $client->Logon($logonResquestData); 

return $logon_request; 

上面的代碼引發以下錯誤

Fatal error: Uncaught SoapFault exception: [a:InternalServiceFault] LogonRequest.AgentName:LengthStringAttribute: The value of LogonRequest.AgentName:LengthStringAttribute is empty, but is not optional. in C:\Inetpub\vhosts\domain.com\tiger\x.php:27 
Stack trace: 
#0 C:\Inetpub\vhosts\domain.com\tiger\x.php(27): SoapClient-&gt;__call('Logon', Array) 
#1 C:\Inetpub\vhosts\domain.com\tiger\x.php(27): SoapClient-&gt;Logon(Object(SimpleXMLElement)) 
#2 {main} 

拋出C:\的Inetpub \虛擬主機\ domain.com \虎\上線x.php

我是否發送所述以正確的方法請求正確的模式?我哪裏錯了?

回答

0

你並不需要創建XML,和SoapClient使用時,您的登錄請求數據應該是這樣的:

$logonResquestData = array(
    'DomainCode' => 'WWW', 
    'AgentName' => '****', 
    'Password' => '*****', 
    'RoleCode' => 'abcabc', 

) 
+0

如果我改變logonrequestdata按你的建議,我得到的錯誤'致命錯誤:未捕獲的SOAPFault異常:[a:InternalServiceFault]對象引用未設置爲對象的實例 –