Как сделать так, чтобы Spyne не упаковывал мой ответ?

Вот образец сервиса

NS = 'my_app_namespace'

class MyMethodRS(ComplexModel):
    __tns__ = NS
    Version = XmlAttribute(Unicode)

class MyService(ServiceBase):
    __tns__ = NS

    @srpc(Unicode, _returns=MyMethodRS, _out_variable_name='MyMethodRS')
    def my_method(foo):
        response = MyMethodRS()
        response.Version = '1.0'
        return response

# and then application will be created and starged as wsgi app

Потом отправляю запрос

<?xml version='1.0' encoding='UTF-8' ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
  <soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <my_method xmlns="my_app_namespace">
      <foo>bar</foo>
    <my_method>
  </soap:Body>
</soap:Envelope>

И я получил

<?xml version='1.0' encoding='UTF-8' ?>
<senv:Envelope>
  <senv:Body>
    <tns:my_methodResponse>
      <tns:MyMethodRS Version="1.0" />
    </tns:my_methodResponse>
  </senv:Body>
</senv:Envelope>

Я не хочу, чтобы ответ был заключен в my_methodResponse. Я попытался добавить _body_style='bare' к @srpc и получил ошибку

<?xml version='1.0' encoding='UTF-8' ?>
<senv:Envelope>
  <senv:Body>
    <senv:Fault>
      <faultcode>senv:Client.SchemaValidationError</faultcode>
      <faultstring><string>:14:0:ERROR:SCHEMASV:SCHEMAV_CVC_TYPE_3_1_2: Element '{http://www.opentravel.org/OTA/2003/05}my_method': Element content is not allowed, because the type definition is simple.</faultstring>
      <faultactor />
    </senv:Fault>
  </senv:Body>
</senv:Envelope>

Как мне с этим справиться? Я пытаюсь внедрить строгий API и не могу добавлять какие-либо обертки к своим ответам.


person Anton Egorov    schedule 23.10.2013    source источник


Ответы (1)


Судя по этому запросу:

<my_method xmlns="my_app_namespace">
  <foo>bar</foo>
<my_method>

Ты нуждаешься в этом:

class MyMethodRequest(ComplexModel):
    foo = Unicode

class MyService(ServiceBase):
    @srpc(MyMethodRequest, _returns=MyMethodRS, _body_style='bare' 
                           _out_variable_name='MyMethodRS')
    def my_method(request):
        foo = request.foo
        response = MyMethodRS()
        response.Version = '1.0'
        return response

Что очень близко к тому, что на самом деле делает обычный режим.

person Burak Arslan    schedule 25.10.2013
comment
Большое спасибо! Определение голое кажется мне более понятным, потому что оно имеет четкое описание модели запроса. - person Anton Egorov; 25.10.2013
comment
Независимо от того, что плавает в вашей лодке :) - person Burak Arslan; 25.10.2013
comment
Проблема здесь в том, что _body_style='bare' принимает только один параметр. и иногда он не проходит проверку wsdl для некоторых клиентов. Есть ли другой способ? - person Farshid Ashouri; 02.07.2016
comment
В голом режиме нет места для другого параметра. Если этой функции нужно больше данных, она должна войти в этот единственный параметр. - person Burak Arslan; 04.07.2016
comment
Что касается сбоев WSDL, отправьте сообщение о проблеме в репозиторий github, чтобы я мог посмотреть - person Burak Arslan; 04.07.2016