Понимание RPC-декораторов: сложные возвращаемые аргументы с SOAP и XML - PullRequest
0 голосов
/ 04 июня 2019

Я новичок в создании веб-сервисов SOAP и у меня есть вопрос о RPC-декораторах.

В любом случае, мое намерение состоит в том, чтобы мой веб-сервис имел несколько более сложный тип возврата (я считаю, что это его полиморфный тип).).Протокол ввода - SOAP, а протокол вывода - XML.

Я хотел бы вернуть словарь, содержащий массив, каждый из которых со значениями, которые могут быть как плавающими, так и строковыми (см. Строку 6 в коде ниже).).Я понимаю, как это будет выглядеть как дерево элементов XML - однако я не знаю, как обозначить это в параметре _returns декоратора @rpc.Чтобы сделать ситуацию немного сложнее, если клиент отправляет неверные учетные данные, я просто хотел бы вернуть строку «Неверные учетные данные».Или, возможно, было бы проще вернуть пустой список ...

Некоторые советы по этому вопросу очень ценятся!

class CoreService(ServiceBase):
    @rpc(Unicode, Unicode, Integer, _returns=Unicode) #@rpc arguments corespond to the retrieve_score() arguments below
    def retreive_score(ctx, username, password, uid):
        if validate_creds(username,password):
            return {"score:" 0.6, features=[{"gender": "male"}, {"height": 160], ... ]
        else:
            return "Invalid credentials"


application = Application([CoreService], 'spyne.iefp.soap',
                          in_protocol=Soap11(validator='lxml'),
                          out_protocol=XmlDocument(polymorphic=True))

1 Ответ

0 голосов
/ 07 июня 2019

SOAP имеет один тип возврата. Идиоматический способ состоит в том, чтобы выдавать исключения при ошибках, не возвращая мошеннический ответ (т. Е. Ответ, который не совместим с указанным типом возврата)

Если вы хотите вернуть произвольные данные, вы можете попробовать _return=AnyDict или, что еще лучше, _return=AnyXml, что позволит вам вернуть все, что вы захотите.

См. Эту функцию, чтобы понять, как произвольные советы преобразуются в документы XML.

https://github.com/arskom/spyne/blob/b8925ee5dc407eb9e2a8d97047f14b10425ee01d/spyne/util/etreeconv.py#L60

Эта функция реализует один из возможных способов отображения словарей в данные XML. Это процесс с потерями, поэтому он может или не может удовлетворить ваши потребности.

Если он не работает для вас, вам придется использовать тип AnyXml и напрямую использовать lxml для построения вашего ответа. Я предлагаю API lxml.builder. Смотрите здесь для получения дополнительной информации: https://lxml.de/api/lxml.builder.ElementMaker-class.html

...