您好我遇到了PHP SOAP请求的问题,而且我已经厌倦了在网上找到的示例。以下是我需要发送的请求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包含http://pastie.org/9263788
我尝试过以下代码
$test = array("DomainCode"=>"WWW","AgentName"=>"API****",
"Password"=>"******","RoleCode"=>"APIB",
"LocationCode"=>"","TerminalInfo"=>"");
$wsdl = "https://trtestr3xapi.navitaire.com/sessionmanager.svc?wsdl";
$client = new SoapClient($wsdl, array('trace' => 1,'exceptions' => true));
$header = new SoapHeader('http://schemas.navitaire.com/WebServices/ISessionManager/Logon','ContractVersion','330', '1');
$client->__setSoapHeaders($header);
try {
$logon_request = $client->Logon($test);
print_r($logon_request);
echo "success!";
} catch (SoapFault $soap_error) {
echo $soap_error;
echo "error!";
}
我使用$client->__getFunctions()
array(4) {
[0]=>
string(54) "void ChangePassword(ChangePasswordRequest $parameters)"
[1]=>
string(45) "LogonResponse Logon(LogonRequest $parameters)"
[2]=>
string(38) "void Logout(LogoutRequest $parameters)"
[3]=>
string(75) "TransferSessionResponse TransferSession(TransferSessionRequest $parameters)"
}
类型在此链接中http://pastie.org/9289906
WSDL中包含的链接https://trtestr3xapi.navitaire.com/SessionManager.svc?xsd=xsd3
具有ContractVersion信息
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.navitaire.com/WebServices" elementFormDefault="qualified" targetNamespace="http://schemas.navitaire.com/WebServices">
<xs:element name="ContractVersion" type="xs:int"/>
<xs:element name="LogonResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="Signature" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Signature" nillable="true" type="xs:string"/>
</xs:schema>
代码更新
$wsdl = 'https://trtestr3xapi.navitaire.com/sessionmanager.svc?wsdl';
$header = new SoapHeader('http://schemas.navitaire.com/WebServices','ContractVersion','330', '1');
$ns_d4p1 = 'http://schemas.navitaire.com/WebServices/DataContracts/Session';
$ns_i = 'http://www.w3.org/2001/XMLSchema-instance';
$client = new SoapClient($wsdl, array('trace' => 1));
$client->__setSoapHeaders($header);
$logonResquestData = new SimpleXMLElement("<logonRequestData xmlns:i='$ns_i' xmlns:d4p1='$ns_d4p1' />");
$logonResquestData->addChild('d4p1:DomainCode', 'WWW', $ns_d4p1);
$logonResquestData->addChild('d4p1:AgentName', 'APISERANGOONAT', $ns_d4p1);
$logonResquestData->addChild('d4p1:Password', 'Newskies-1', $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);
//var_dump($logonResquestData->asXML());
$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\ezyflying.com\tiger\x.php:22 Stack trace: #0 C:\Inetpub\vhosts\ezyflying.com\tiger\x.php(22): SoapClient->__call('Logon', Array) #1 C:\Inetpub\vhosts\ezyflying.com\tiger\x.php(22): SoapClient->Logon(Object(SimpleXMLElement)) #2 {main} thrown in C:\Inetpub\vhosts\ezyflying.com\tiger\x.php on line 22
答案 0 :(得分:1)
错误表示您在声明标题&#34;时使用的名称空间中的标题ContractVersion
未被理解&#34;。那是因为在这个目标命名空间的模式中可能没有声明ContractVersion
个元素。
根据您的SOAP请求,ContractVersion
属于另一个命名空间:
<h:ContractVersion xmlns:h="http://schemas.navitaire.com/WebServices">
添加标题时应使用 命名空间:
$header = new SoapHeader('http://schemas.navitaire.com/WebServices','ContractVersion','330', '1');
对于您的LogonRequest
数据,根据您希望生成的结果,您需要向其添加LogonRequestData
个对象。您的架构不可用,我不知道使用PHP API的确切语法。一种方法是将有效负载添加为文字XML 。您可能必须在SOAP客户端中为此设置一些配置,并且我不确定这是否是PHP的标准建议过程。如果您可以发送文字XML,那么您可以使用以下代码构建一个<logonRequestData>
对象,就像您发布的那样:
$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', 'API****', $ns_d4p1);
$logonResquestData->addChild('d4p1:Password', '****', $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);
您可以通过打印来检查上面的代码是否生成了正确的XML:
print_r($logonResquestData->asXML());
现在,您必须将该对象添加到LogonRequest
对象,方法是将其作为参数传递给Logon
操作。我不确定确切的语法。您可能需要添加SoapParam或SoapVar。你建议使用一个数组。无论采用何种方法,您都必须在尝试发送之前测试它并查看它是否生成了正确的XML。以这种方式调试会更容易。