【问题标题】:PHP Soap Request: XML Body missing in the requestPHP Soap 请求:请求中缺少 XML 正文
【发布时间】:2014-06-16 16:00:52
【问题描述】:

请求 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

PHP 代码

$options  = array("soap_version"=> SOAP_1_1,
            "trace"=>1,
            "exceptions"=>0
            );

$client = new SoapClient('https://trtestr3xapi.navitaire.com/sessionmanager.svc?wsdl',$options);

$header[] = new SoapHeader('http://schemas.microsoft.com/ws/2005/05/addressing/none','Action','http://schemas.navitaire.com/WebServices/ISessionManager/Logon',1);
$header[] = new SoapHeader('http://schemas.navitaire.com/WebServices','ContractVersion','330', false);

$client->__setSoapHeaders($header);

$params = array("LogonRequestData" => array("AgentName" => "API*****",
                "Password" => "Pass****",
                "RoleCode" => "APIB",
                "DomainCode" => "WWW"));

try{   
$h= $client->Logon($params); 
print nl2br(print_r($h, true));  
echo 'Request : <br/><xmp>', 
$client->__getLastRequest();
echo '</xmp>';
}
catch(SoapFault $fault){  
echo 'Request : <br/><xmp>', 
$client->__getLastRequest(), 
'</xmp><br/><br/> Error Message : <br/>', 
$fault->getMessage(); 
} 

从 __getLastRequest() 生成的 XML 请求

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.navitaire.com/WebServices/ServiceContracts/SessionService" xmlns:ns2="http://schemas.microsoft.com/ws/2005/05/addressing/none" xmlns:ns3="http://schemas.navitaire.com/WebServices">
<SOAP-ENV:Header>
    <ns2:Action SOAP-ENV:mustUnderstand="1">http://schemas.navitaire.com/WebServices/ISessionManager/Logon</ns2:Action>
    <ns3:ContractVersion>330</ns3:ContractVersion>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
    <ns1:LogonRequest/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

如您所见,XML 正文为空。如何使用参数填充主体?

可以在这里看到完整的输出,它被捕获在try{ } 块中http://pastie.org/9295467

在输出中你也可以看到

//If i use soap version 1.1
[faultstring] => Bad Request  
[faultcode] => HTTP

//If i use soap version 1.2
[faultstring] => Cannot process the message because the content type 'application/soap+xml; charset=utf-8; action="http://schemas.navitaire.com/WebServices/ISessionManager/Logon"' was not the expected type 'text/xml; charset=utf-8'.
[faultcode] => HTTP

【问题讨论】:

    标签: php xml soap


    【解决方案1】:

    您是否尝试切换到 SOAP_1_2,因为错误消息看起来与此相关联。 否则,您可以使用 WSDL 到 php 生成器,例如 WsdlToPhp wsdltophp.com

    【讨论】:

    • 我试过soap1.2它也抛出了我在帖子最后部分强调的错误。
    • 嗨,Mikael wsdltophp 工作得很棒...我需要在生成的示例文件中设置标题。我该如何进行?
    • 哪种类型的标头:SOAP 标头或 HTTP 标头?
    • 嗨 Mikael 我需要设置肥皂标题。你能帮忙吗?
    • 您可以通过contact@wsdltophp.com与我联系
    【解决方案2】:

    我遇到了同样的问题,并设法使用没有压缩的 SOAP_1_1 修复它。

    所以只需禁用压缩。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 2018-07-18
      • 2018-11-26
      • 1970-01-01
      • 2011-06-24
      • 2019-10-21
      • 2012-05-05
      相关资源
      最近更新 更多