#php #web-services #soap
#php #веб-сервисы #soap
Вопрос:
Мне не хватает значения в ответе SOAP. Я не вижу значения как в print_r, так и в __getLastResponse . Я регистрирую ответ на стороне сервера, прежде чем возвращать ответ, и я вижу отсутствующее значение ‘contentListRef’, и оно не является пустым.
Из того, что я исследовал, кажется, что данные теряются во время синтаксического анализа SOAP, но я не понимаю, как это исправить. Кэширование WSDL отключено. Какие-либо рекомендации по устранению этой проблемы?
Print_r ответа выдает следующее
stdClass Object
(
[questions] => stdClass Object
(
[multipleChoiceQuestion] => stdClass Object
(
[label] => stdClass Object
(
[text] => Search type:
[dir] => ltr
)
[choices] => stdClass Object
(
[choice] => Array
(
[0] => stdClass Object
(
[label] => stdClass Object
(
[text] => Basic
[dir] => ltr
)
[id] => search_type_basic
)
)
)
[id] => search_type
[allowMultipleSelections] =>
)
[inputQuestion] => stdClass Object
(
[inputTypes] => stdClass Object
(
[input] => stdClass Object
(
[type] => TEXT_ALPHANUMERIC
)
)
[label] => stdClass Object
(
[text] => Search type:
[dir] => ltr
)
[id] => search_box
)
)
)
__getLastResponse:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://www.daisy.org/ns/daisy-online/">
<env:Body>
<ns1:getQuestionsResponse>
<ns1:questions>
<ns1:multipleChoiceQuestion id="search_type" allowMultipleSelections="false">
<ns1:label dir="ltr">
<ns1:text>Search type:</ns1:text>
</ns1:label>
<ns1:choices>
<ns1:choice id="search_type_basic">
<ns1:label dir="ltr">
<ns1:text>Basic</ns1:text>
</ns1:label>
</ns1:choice>
</ns1:choices>
</ns1:multipleChoiceQuestion>
<ns1:inputQuestion id="search_box">
<ns1:inputTypes>
<ns1:input type="TEXT_ALPHANUMERIC"/>
</ns1:inputTypes>
<ns1:label dir="ltr">
<ns1:text>Search type:</ns1:text>
</ns1:label>
</ns1:inputQuestion>
</ns1:questions>
</ns1:getQuestionsResponse>
</env:Body>
</env:Envelope>
xsd-файл:
<xs:element name="questions">
<xs:complexType>
<xs:choice>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element ref="multipleChoiceQuestion"/>
<xs:element ref="inputQuestion"/>
</xs:choice>
<xs:element name="contentListRef" type="xs:NMTOKEN"/>
<xs:element ref="label"/>
</xs:choice>
</xs:complexType>
</xs:element>
С WSDL можно ознакомиться здесь
Комментарии:
1.
contentListRef
не существует в WSDL, хотя я думаю, что это актуально2. @RiggsFolly поскольку
contentListRef
это не элемент ‘ref’, обязательно ли он должен быть в WSDL? У меня есть другой вызов, который возвращает элемент ‘non-ref’, напримерcontentListRef
, даже если он не существует в WSDL.3. @RiggsFolly Также отсутствует WSDL
multipleChoiceQuestion
, но я получаю это значение. Я предполагаю, что WSDL показывает, что ответ будетquestions
, а xsd показывает схемуquestions
Ответ №1:
Я смог определить и устранить проблему. Проблема заключалась в несоответствии xsd и структуры данных.
Фиктивный ответ от сервера был
$questions = [
'multipleChoiceQuestion' => ['label'=>['text'=>'testtxt'],'choices'=>['choice'=>[['label'=>['text'=>'basic','dir'=>'ltr'],'id'=>'search_type_basic']]]],
'inputQuestion' => '',
'contentListRef' => 'L100',
'label' => ['text'=>'testtxt1'],
];
Я изменил файл xsd, и он сработал
<xs:element name="questions">
<xs:complexType>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element ref="multipleChoiceQuestion"/>
<xs:element ref="inputQuestion"/>
<xs:element name="contentListRef" type="xs:NMTOKEN"/>
<xs:element ref="label"/>
</xs:choice>
</xs:complexType>
</xs:element>