我正在尝试使用SOAPclient调用API,但验证失败,因为xml中缺少名称空间
例外XML
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://tourico.com/webservices/" xmlns:trav="http://tourico.com/travelservices/">
<soapenv:Header>
<web:LoginHeader>
<trav:username>*****</trav:username>
<trav:password>*******</trav:password>
<trav:culture>en_US</trav:culture>
<trav:version>7.123</trav:version>
</web:LoginHeader>
</soapenv:Header>
<soapenv:Body>
<web:CancelReservation>
<web:nResID>1235456</web:nResID>
</web:CancelReservation>
</soapenv:Body>
</soapenv:Envelope>
我实际发送的内容(LoginHeader中没有命名空间)
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tourico.com/webservices/" xmlns:ns2="http://tourico.com/travelservices/">
<SOAP-ENV:Header>
<ns2:LoginHeader>
<username>******</username>
<password>*******</password>
<culture>en_US</culture>
<version>8.0</version>
</ns2:LoginHeader>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:CancelReservation>
<ns1:nResID>95665639</ns1:nResID>
</ns1:CancelReservation>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我的PHP代码
$url = "http://demo-wsnew.touricoholidays.com/ReservationsService.asmx?wsdl";
$user = "*****";
$pwd = "********";
$culture = "en_US";
$version = "8.0";
$wsdl = $url;
$client = new SOAPClient($wsdl,array("trace" => true, "exceptions" => true, 'soap_version' => SOAP_1_1));
$login = new stdClass();
$login->usernam= $user;
$login->password = $pwd;
$login->culture = $culture;
$login->version = $version;
// Turn auth header into a SOAP Header
$header = new SoapHeader('http://tourico.com/travelservices', 'LoginHeader', $login, false);
// set the header
$client->__setSoapHeaders($header);
$r = new stdClass();
$r->nResID = 123456;
try
{
$res = $client->CancelReservation($r);
$results = json_decode(json_encode($res), true);
Log::error($client->__getLastRequest());
Log::error(print_r($results , true));
}
catch(Exception $e)
{
Log::error($client->__getLastRequest());
Log::error($e->getMessage());
}
有没有办法可以将XML字符串发送到SOAPclient?
答案 0 :(得分:1)
您在命名空间中缺少尾部斜杠,因此这可能是问题的一部分。
这是类图功能可能有用的情况。试试这段代码:
$url = "http://demo-wsnew.touricoholidays.com/ReservationsService.asmx?wsdl";
$user = "*****";
$pwd = "********";
$culture = "en_US";
$version = "8.0";
$wsdl = $url;
class MyLoginHeader
{
public $username;
public $password;
public $culture;
public $version;
}
$classmap = array('LoginHeader' => 'MyLoginHeader');
$client = new SOAPClient($wsdl,array("classmap" => $classmap,"trace" => true, "exceptions" => true, 'soap_version' => SOAP_1_1));
$login = new MyLoginHeader();
$login->username = $user;
$login->password = $pwd;
$login->culture = $culture;
$login->version = $version;
// Turn auth header into a SOAP Header
$header = new SoapHeader('http://tourico.com/travelservices/', 'LoginHeader', $login, false);
// set the header
$client->__setSoapHeaders($header);
$r = new stdClass();
$r->nResID = 123456;
try
{
$res = $client->CancelReservation($r);
$results = json_decode(json_encode($res), true);
}
catch(Exception $e)
{
var_dump($client->__getLastRequest());
var_dump($e->getMessage());
}
代码生成一个类似于:
的XML请求 <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://tourico.com/webservices/" xmlns:ns2="http://tourico.com/travelservices/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Header>
<ns2:LoginHeader xsi:type="ns2:LoginHeader">
<ns2:username>*****</ns2:username>
<ns2:password>********</ns2:password>
<ns2:culture>en_US</ns2:culture>
<ns2:version>8.0</ns2:version>
</ns2:LoginHeader>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:CancelReservation>
<ns1:nResID>123456</ns1:nResID>
</ns1:CancelReservation>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>