Служба SOAP пропускает значения в ответе

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