SOAP中的PHP纯XML

时间:2016-08-14 18:34:15

标签: php xml soap

我正在尝试使用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?

1 个答案:

答案 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>