Я потратил часы, пытаясь понять это, и ничего из того, что я пробовал из предложений SO на PHP.net, не сработало. Я пытаюсь заставить SOAP Call работать, когда у меня есть несколько вложенных уровней XML, и есть атрибуты на верхнем уровне, а также подуровни, и кажется, что ничего не работает. Куда я не так с моим кодом?
Я пробовал то, что похоже на все, из SO и PHP.net, но ни один из ответов, кажется, не описывает достаточно глубоко или несколько уровней XML, все они, кажется, предполагают, что вы углубляетесь только на один уровень.
Я пробовал оба ниже, в дополнение к большему:
$params = array("Request"=>array("_"=>array("Credentials"=>array("UserNumberCredentials"=>array("UserNumber"=>$userNumber,"Password"=>$password)),"DeviceInformation"=>array("_"=>"","DeviceType"=>$this->deviceType,"DeviceNumber"=>$this->deviceNumber)),"MessageId"=>$this->messageId));
$params = array("Request"=>array("_"=>array("Credentials"=>array("_"=>array("UserNumberCredentials"=>array("_"=>array("UserNumber"=>$userNumber,"Password"=>$password)))),"DeviceInformation"=>array("_"=>"","DeviceType"=>$this->deviceType,"DeviceNumber"=>$this->deviceNumber)),"MessageId"=>$this->messageId));
И ожидаемый XML:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" >
<soapenv:Header/>
<soapenv:Body>
<user:logon>
<!--Optional:-->
<Request MessageId="messageId">
<!--Optional:-->
<Credentials>
<!--Optional:-->
<UserNumberCredentials>
<!--Optional:-->
<UserNumber>value</UserNumber>
<!--Optional:-->
<Password>value</Password>
</UserNumberCredentials>
</Credentials>
<!--Optional:-->
<DeviceInformation DeviceType="deviceType" DeviceNumber="number" />
</Request>
</user:logon>
</soapenv:Body>
</soapenv:Envelope>
Я передаю параметры в вызов SOAP следующим образом:
$results = $this->client->logon($params);
Я пробовал несколько способов, и он либо возвращает ошибку проверки, где он говорит, что в теге запроса отсутствует атрибут MessageId, либо когда он возвращает ошибку мыла, сообщающую, что информация об устройстве или учетные данные неверны, и я знаю, что они ' оба они правильно набраны и правильно переданы в переменные функции-обертки, поэтому они правильно передаются через мыльный вызов. Но так как он возвращает ошибку мыла, я не могу сказать, какой именно XML он передает.
UPDATE:
Приведенные ниже параметры являются своего рода правильными, но я думаю, что оба атрибута DeviceInformation не отправляются. Я думаю, что это только отправка одного, поэтому сервер отклоняет вызов. Сам тег DeviceInformation является пустым, но атрибуты DeviceNumber и DeviceType являются обязательными для этого тега, и я думаю, что только один или ни один не отправляется в вызове. Но он возвращает ошибку, поэтому я не могу увидеть XML.
$params = array("Request"=>array("_"=>array("Credentials"=>array("UserNumberCredentials"=>array("UserNumber"=>$userNumber,"Password"=>$password)),"DeviceInformation"=>array("_"=>"","DeviceType"=>$this->deviceType,"DeviceNumber"=>$this->deviceNumber)),"MessageId"=>$this->messageId));