Почему __soapcall переводит xs: decimal в "true"? - PullRequest
0 голосов
/ 12 мая 2019

Я использую PHP Soap.

Это фрагмент, полученный из __getLastRequest ().Я застрял в том, почему «Версия» выходит как «истина» вместо значения, которое я установил: «1.0»?

На самом деле, проблема не только с версией, у меня естьпроблема с TimeStamp тоже.Для этого я установил значение \ DateTime :: ATOM.Не уверен, почему он выходит как 2019.

<ns1:OTA_CruiseSailAvailRQ TimeStamp="2019" Version="true" 

Сервер SOAP отказывается принимать мой XML, SoapFault выглядит следующим образом.Я сформировал XML вручную в пользовательском интерфейсе SOAP и опубликовал, и все работает, как ожидалось.Однако, когда я делаю это с PHP Soap, я получаю этот SoapFault, и единственные две вещи - это Version и TimeStamp.

 [faultstring] => 
Internal Error (from server)

    [faultcode] => 
env:Receiver

вот немного больше XML:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://www.opentravel.org/OTA/2003/05/alpha" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://services.rccl.com/Interfaces/SailingList">

 <env:Body>

   <ns2:getSailingList>

     <ns1:OTA_CruiseSailAvailRQ TimeStamp="2019" Version="true"


В WSDL определения TimeStamp и Version таковы:

WSDL

<xs:attribute name="Version" type="xs:decimal" use="required">
            <xs:annotation>
                <xs:documentation xml:lang="en">For all OTA versioned messages, the version of the message is indicated by a decimal value.</xs:documentation>
            </xs:annotation>
</xs:attribute>

<xs:attribute name="TimeStamp" type="xs:dateTime" use="optional">
            <xs:annotation>
                <xs:documentation xml:lang="en">Indicates the creation date and time of the message in UTC using the following format specified by ISO 8601; YYYY-MM-DDThh:mm:ssZ with time values using the 24 hour clock (e.g. 20 November 2003, 1:59:38 pm UTC becomes 2003-11-20T13:59:38Z).</xs:documentation>
            </xs:annotation>
</xs:attribute>

Вот как я устанавливаю значения и инициируюSOAP-вызов

$test = new MyNamespace\OTA_CruiseSailAvailRQ();
$d = new DateTime('NOW');

$test->setTimeStamp($d);
$test->setVersion(1.0);    


$sailCall = new MyNamespace\Cruise_FIT_External(['trace' => 1,
                                   'exception' => 0,
                                   'login' => 'xxxxxxx', 
                                   'password' => 'xxxxxxxx',
                                  'soap_version' => SOAP_1_2]);


$resp = $sailCall->getSailingList(new MyNamespace\getSailingList($test));

Я использовал Wsdl2PhpGenerator для генерации моих классов из моего WSDL.Вот почему вы видите Cruise_FIT_External и не видите прямого экземпляра SoapClient.Но это расширяет SoapClient.Так что у нас все хорошо.

namespace MyNamespace;

class Cruise_FIT_External extends \SoapClient
{
    /**
     * @param getSailingList $parameters
     * @return getSailingListResponse
     */
    public function getSailingList(getSailingList $parameters)
    {

      return $this->__soapCall('getSailingList', array($parameters));
    }
}

Так определяются функции setTimestamp и SetVersion.Опять же, это вывод кода Wsdl2PhpGenerator.Поэтому я думаю, что это хорошо.


namespace MyNamespace;

class OTA_CruiseSailAvailRQ
{

    /**
     * @var float $Version
     */
    protected $Version = null;

    /**
     * @var \DateTime $TimeStamp
     */
    protected $TimeStamp = null;

    /**
     * @param \DateTime $TimeStamp
     * @return \MyNamespace\OTA_CruiseSailAvailRQ
     */
    public function setTimeStamp(\DateTime $TimeStamp)
    {
      $this->TimeStamp = $TimeStamp->format(\DateTime::ATOM);
      return $this;
    }


    /**
     * @return \DateTime
     */
    public function getTimeStamp()
    {
      if ($this->TimeStamp == null) {
        return null;
      } else {
        try {
            return DateTime::createFromFormat(\DateTime::ATOM, $this->TimeStamp); 
          // this below was the original line. didn't work. changed it to the line above. that didn't work either.
          //return new \DateTime($this->TimeStamp); 
           return $this->TimeStamp;
        } catch (\Exception $e) {
          return false;
        }
      }
    }

    /**
     * @return float
     */
    public function getVersion()
    {
      return $this->Version;
    }

    /**
     * @param float $Version
     * @return \MyNamespace\OTA_CruiseSailAvailRQ
     */
    public function setVersion($Version)
    {
      $this->Version = $Version;
      return $this;
    }

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

<ns1:OTA_CruiseSailAvailRQ TimeStamp="2019-05-11T15:30:41-05:00" Version="1.0" 

Заранее спасибо за любую помощь!

1 Ответ

0 голосов
/ 12 мая 2019

Обрадовался поиску другого метода для вызова этих SOAP API вместо использования Classes и SoapClient

Используется этот метод из этого поста Stackoverflow - вместо него используется Curl. Такой спаситель жизни!

Все хорошо работает!

...