2016-04-25 3 views
0

Я пытаюсь сделать SOAP-вызов с использованием SoapClient в PHP, но у меня возникают проблемы с отправкой параметров тела. Заголовки отправляются просто отлично, и ошибок нет, но тело пусто.PHP SoapClient Body Параметры не отправляются

Я не очень хорошо знаком с PHP, так что это ново для меня.

Вот мой Войти функция:

function Login($username, $password, $clientaccesskey, $useraccesskey) 
{ 
    $parameters = array(
        'LogOnRequest' => 
          array(
           'ClientAccessKey' => $clientaccesskey, 
           'Password' => $password, 
           'UserAccessKey' => $useraccesskey, 
           'UserName' => $username 
           ) 
        ); 

    $headers = array(); 

    $headers[] = new SoapHeader('http://www.w3.org/2005/08/addressing', 'Action', 'http://www.ultipro.com/dataservices/bidata/2/IBIDataService/LogOn'); 
    $headers[] = new SoapHeader('http://www.w3.org/2005/08/addressing', 'To', 'https://service4.ultipro.com/services/BiDataService'); 

    try 
    { 
     $soapclient = new SoapClient('https://service4.ultipro.com/services/BiDataService', array('soap_version' => SOAP_1_2, 'encoding' => 'UTF-8', 'exceptions' => TRUE, 'trace' => TRUE)); 
     $soapclient->__setSoapHeaders($headers); 
     $response = $soapclient->__soapCall('LogOn', array($parameters)); 

     echo json_encode($response); 

     echo htmlentities($soapclient->__getLastRequest()); 
    } 
    catch(SoapFault $fault){ 
     echo $fault->faultstring; 
    } 

} 

Когда я запускаю этот код он, как представляется, говорить с сервером, потому что я получаю ответ:

{"LogOnResult":{"ServiceId":null,"ClientAccessKey":null,"Token":null,"Status":"Failed","StatusMessage":"User authentication failed","InstanceKey":null}} 

Но это XML, что направляется на службу:

<?xml version="1.0" encoding="UTF-8"?> 
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://www.ultipro.com/dataservices/bidata/2" xmlns:ns2="http://www.w3.org/2005/08/addressing"> 
    <env:Header> 
     <ns2:Action>http://www.ultipro.com/dataservices/bidata/2/IBIDataService/LogOn</ns2:Action> 
     <ns2:To>https://service4.ultipro.com/services/BiDataService</ns2:To> 
    </env:Header> 
    <env:Body> 
     <ns1:LogOn /> 
    </env:Body> 
</env:Envelope> 

Это то, что XML должен выглядеть следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> 
    <s:Header> 
     <a:Action s:mustUnderstand="1">http://www.ultipro.com/dataservices/bidata/2/IBIDataService/LogOn</a:Action> 
     <a:To s:mustUnderstand="1">https://servicehost/services/BiDataService</a:To> 
    </s:Header> 
    <s:Body> 
     <LogOn xmlns="http://www.ultipro.com/dataservices/bidata/2"> 
     <logOnRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
      <UserName>username</UserName> 
      <Password>password</Password> 
      <ClientAccessKey>12345</ClientAccessKey> 
      <UserAccessKey></UserAccessKey> 
     </logOnRequest> 
     </LogOn> 
    </s:Body> 
</s:Envelope> 

Что я делаю неправильно, что приводит к тому, что параметры тела не отправляются в запросе SOAP?

ответ

2

мне удалось добиться этого с помощью класса, то SOAPVar и SOAPParam классы, как это:

function Login($username, $password, $clientaccesskey, $useraccesskey) 
{ 
    // Class handler for the request 
    class LogOnRequest { 
     function __construct($usr, $pwd, $cak, $uak) 
     { 
      $this->UserName = $usr; 
      $this->Password = $pwd; 
      $this->ClientAccessKey = $cak; 
      $this->UserAccessKey = $uak; 
     } 
    } 

    // Conversion to a SOAP object 
    $lor = new LogOnRequest($username, $password, $clientaccesskey, $useraccesskey); 
    $logOnRequest = new SoapVar($lor, SOAP_ENC_OBJECT, 'LogOnRequest', 'http://soapinterop.org/xsd'); 

    $headers = array(); 
    $headers[] = new SoapHeader('http://www.w3.org/2005/08/addressing', 'Action', 'http://www.ultipro.com/dataservices/bidata/2/IBIDataService/LogOn'); 
    $headers[] = new SoapHeader('http://www.w3.org/2005/08/addressing', 'To', 'https://service4.ultipro.com/services/BiDataService'); 

    try 
    { 
     $soapclient = new SoapClient('https://service4.ultipro.com/services/BiDataService', array('soap_version' => SOAP_1_2, 'encoding' => 'UTF-8', 'exceptions' => TRUE, 'trace' => TRUE)); 
     $soapclient->__setSoapHeaders($headers); 

     // Direct call to the LogOn method and SOAP parameter pass 
     $response = $soapclient->LogOn(new SoapParam($logOnRequest, 'logOnRequest')); 

     echo json_encode($response); 

     echo htmlentities($soapclient->__getLastRequest()); 
    } 
    catch(SoapFault $fault){ 
     echo $fault->faultstring; 
    } 

} 

Который дал мне следующий запрос XML:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://soapinterop.org/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://www.ultipro.com/dataservices/bidata/2" xmlns:ns3="http://www.w3.org/2005/08/addressing"> 
    <env:Header> 
     <ns3:Action>http://www.ultipro.com/dataservices/bidata/2/IBIDataService/LogOn</ns3:Action> 
     <ns3:To>https://service4.ultipro.com/services/BiDataService</ns3:To> 
    </env:Header> 
    <env:Body> 
     <ns2:LogOn xsi:type="ns1:LogOnRequest"> 
      <UserName>u</UserName> 
      <Password>p</Password> 
      <ClientAccessKey>cak</ClientAccessKey> 
      <UserAccessKey>uak</UserAccessKey> 
     </ns2:LogOn> 
    </env:Body> 
</env:Envelope> 
+0

Спасибо за помощь. Я все еще не могу войти в систему через webservice. Единственное, что я не уверен в этом, - это «« Нужно ли это влагаться дальше или вы думаете, что вы должны выводить? – user3788671

+0

Я думаю, это должен работать, но лучше попросите владельца мыльного устройства посмотреть, как следует отправлять данные за год. –

+0

Хорошо, спасибо! – user3788671

Смежные вопросы