Moodle LMS можно использовать для викторины студентов. Один необязательный тип вопроса (непрозрачный) использует SOAP для запроса вопросов от службы (код на https://goo.gl/iGDIiy ).
Существует работающий «сервер вопросов», реализованный в PHP с использованием WSDL, определенного в https://goo.gl/kESENq
Сложность, с которой я сталкиваюсь, состоит в том, что код в типе вопроса ожидал, что некоторые возвращаемые значения будут строкой. Ответ от работающего тестового сервера выглядит так …
<SOAP-ENV:Body>
<ns1:getEngineInfoResponse>
<getEngineInfoReturn xsi:type="SOAP-ENC:string">
<engineinfo>
Обратите внимание на строку 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>
<engineinfo>
Обратите внимание на отсутствие модификатора типа строки. Этот ответ получает код PHP в Moodle в виде объекта, содержащего одно поле без имени, но содержащее возвращенную строку XML. Поскольку это объект, содержащий строку, а не просто строку, код не может правильно проанализировать результат.
Со Spyne я получаю:
soap11env:Body>
<tns:getEngineInfoResponse>
<tns:getEngineInfoReturn><engineinfo>
из этого кода:
@srpc(_returns=String, _body_style='wrapped',
_out_variable_name="getEngineInfoReturn")
def getEngineInfo():
resp = "<engineinfo>\n"
Это также возвращает объект с единственным элементом (теперь называется getEngineInfoReturn), который содержит соответствующую строку.
Тем не менее, получатель (который был доволен произведенным WSDL)
все еще ожидает строку, а не объект, содержащий строку.
Я бы предпочел, чтобы версия Spyne работала, чем версия ZSI, потому что она проще в использовании. Я использовал SOAP и раньше, но не уверен, что в PHP-коде делается необоснованное предположение о возвращаемом формате или я должен быть в состоянии заставить Спайна создать этот формат. От чтения исходного кода для функции декоратора я не думаю, что смогу.
Итак, это плохо закодированный клиент или ожидаемая схема SOAP нормальная? Как я могу заставить Spyne (или ZIS) произвести нечто подобное?
Проходить _out_body_style='bare'
на @rpc.
Других решений пока нет …