У меня есть клиент php и служба на основе gsoap (linux). При вызове одного из методов (служб) я получаю следующее исключение:
Нарушение ограничения проверки: отсутствует идентификатор для ссылки #ref1 в элементе env:Envelope.
Ошибка связана с одним аргументом в вызове, который представляет сложный аргумент. Основой этого аргумента являются «данные массива», показанные ниже в файле wsdl.
Вот соответствующий wsdl:
<complexType name="data-elem">
<sequence>
<element name="name" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<element name="list" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<element name="length" type="xsd:int" minOccurs="1" maxOccurs="1"/>
<element name="stype" type="xsd:int" minOccurs="1" maxOccurs="1"/>
<element name="dtype" type="xsd:int" minOccurs="1" maxOccurs="1"/>
<element name="permission" type="xsd:int" minOccurs="1" maxOccurs="1"/>
<element name="message" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<choice>
<element name="cdata" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<element name="idata" type="xsd:int" minOccurs="1" maxOccurs="1"/>
<element name="fdata" type="xsd:float" minOccurs="1" maxOccurs="1"/>
<element name="ddata" type="xsd:double" minOccurs="1" maxOccurs="1"/>
</choice>
</sequence>
</complexType>
<complexType name="data">
<sequence>
<element name="elems" type="ns:data-elem" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="array-data">
<sequence>
<element name="records" type="ns:data" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
Вот как выглядят переданные данные для этого аргумента:
stdClass Object ( [records] => Array ( [0] => stdClass Object ( [elems] => Array ( [0] => stdClass Object ( [name] => SERVICE.d01 [list] => [length] => 15 [stype] => 1 [dtype] => 0 [permission] => 3 [message] => [cdata] => [email protected] ) [1] => stdClass Object ( [name] => SERVICE.servdef [list] => [length] => 0 [stype] => 3 [dtype] => 0 [permission] => 1 [message] => [idata] => 3 ) ) ) [1] => stdClass Object ( [elems] => Array ( [0] => stdClass Object ( [name] => SERVICE.d01 [list] => [length] => 15 [stype] => 1 [dtype] => 0 [permission] => 3 [message] => [cdata] => [email protected] ) [1] => stdClass Object ( [name] => SERVICE.servdef [list] => [length] => 0 [stype] => 3 [dtype] => 0 [permission] => 1 [message] => [idata] => 3 ) ) ) ) )
Я не совсем уверен, что переданные данные соответствуют схеме, но если я передаю один массив «записей», вызов службы работает без ошибок.
Пример с одним массивом выглядит так:
stdClass Object ( [records] => Array ( [0] => stdClass Object ( [elems] => Array ( [0] => stdClass Object ( [name] => SERVICE.d01 [list] => [length] => 15 [stype] => 1 [dtype] => 0 [permission] => 3 [message] => [cdata] => [email protected] ) [1] => stdClass Object ( [name] => SERVICE.servdef [list] => [length] => 0 [stype] => 3 [dtype] => 0 [permission] => 1 [message] => [idata] => 2 ) ) ) ) )
Ошибка полностью генерируется при проверке клиента php. Сервер никогда не вызывается.
У кого-нибудь есть какие-либо указатели или предложения? Что мне не хватает? Какие еще данные я могу предоставить, чтобы ответить на этот вопрос? Как это отладить?