dousaoxiancy199896 2016-08-14 18:34
浏览 42
已采纳

SOAP中的PHP纯XML

I am trying to call an API using SOAPclient but the authentification fail because namespace missing in the xml

Excepted 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>

What I am actualy sending (No namespace in the 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>

My PHP code

    $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());
}

Is there a way I could just send a XML string to the SOAPclient ?

  • 写回答

1条回答 默认 最新

  • dtpd58676 2016-09-19 20:31
    关注

    You were missing a trailing slash on the namespace, so that was likely part of the problem.

    This is a case where the classmap feature might help. Try this code:

    $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());
    }
    

    The code produces an XML request that looks like:

        <?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>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化