Совместимость между библиотеками PHP SOAP и Python SOAP

Moodle LMS можно использовать для викторины студентов. Один необязательный тип вопроса (непрозрачный) использует SOAP для запроса вопросов от службы (код на https://goo.gl/iGDIiy ).

Существует работающий «сервер вопросов», реализованный в PHP с использованием WSDL, определенного в https://goo.gl/kESENq

Сложность, с которой я сталкиваюсь, состоит в том, что код в типе вопроса ожидал, что некоторые возвращаемые значения будут строкой. Ответ от работающего тестового сервера выглядит так …

<SOAP-ENV:Body>
<ns1:getEngineInfoResponse>
<getEngineInfoReturn xsi:type="SOAP-ENC:string">
&lt;engineinfo&gt;

Обратите внимание на строку xsi: type = .. Данные фактически возвращаются в виде строки в формате XML приложением PHP:

/**
* A dummy implementation of the getEngineInfo method.
* @return string of XML.
*/
public function getEngineInfo() {
return '<engineinfo>

Я пытаюсь связать это с сервером Python + SOAP. Я пытался использовать как ZSI, так и Spyne. В ZSI я использовал WSDL, поставляемый с примером сервера, для генерации заглушек кода. Соответствующий код просто возвращает строку, очень похожую на код PHP. Ответ от этого:

<ns1:getEngineInfoResponse>
<getEngineInfoReturn>
&lt;engineinfo&gt;

Обратите внимание на отсутствие модификатора типа строки. Этот ответ получает код PHP в Moodle в виде объекта, содержащего одно поле без имени, но содержащее возвращенную строку XML. Поскольку это объект, содержащий строку, а не просто строку, код не может правильно проанализировать результат.

Со Spyne я получаю:

soap11env:Body>
<tns:getEngineInfoResponse>
<tns:getEngineInfoReturn>&lt;engineinfo&gt;

из этого кода:

@srpc(_returns=String, _body_style='wrapped',
_out_variable_name="getEngineInfoReturn")
def getEngineInfo():
resp = "<engineinfo>\n"

Это также возвращает объект с единственным элементом (теперь называется getEngineInfoReturn), который содержит соответствующую строку.
Тем не менее, получатель (который был доволен произведенным WSDL)
все еще ожидает строку, а не объект, содержащий строку.

Я бы предпочел, чтобы версия Spyne работала, чем версия ZSI, потому что она проще в использовании. Я использовал SOAP и раньше, но не уверен, что в PHP-коде делается необоснованное предположение о возвращаемом формате или я должен быть в состоянии заставить Спайна создать этот формат. От чтения исходного кода для функции декоратора я не думаю, что смогу.

Итак, это плохо закодированный клиент или ожидаемая схема SOAP нормальная? Как я могу заставить Spyne (или ZIS) произвести нечто подобное?

1

Решение

Проходить _out_body_style='bare' на @rpc.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]