Как указать параметры запроса с идентификаторами в spyne?

Мне поручили создать службу SOAP для одного из наших партнеров. Партнер предоставил мне WSDL в качестве спецификации, которую я должен реализовать на нашей стороне. Я уже добился некоторого прогресса, но теперь я уперся в стену.

Как я могу это реализовать (проблема с строкой <ns:Criteria id="?">)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://...">
   <soapenv:Header/>
   <soapenv:Body>
      <ns:SearchRequest>
         <!--1 or more repetitions:-->
         <ns:Criteria id="?">
            <!--Optional:-->
            <ns:LocationIds>?</ns:LocationIds>
            <ns:Type>?</ns:Type>
         </ns:Criteria>
         <ns:Channel>?</ns:Channel>
         <!--You may enter ANY elements at this point-->
      </ns:SearchRequest>
   </soapenv:Body>
</soapenv:Envelope>

Мой код Python, который предоставляет Службу, в настоящее время выглядит следующим образом:

class CriteriaModel(ComplexModel):
    id = String
    LocationIds = String
    Type = String

class SomeService(Service):

    @rpc(
        Array(CriteriaModel, wrapped=False),
        _returns=Container,
        _in_message_name='SearchRequest',
        _out_message_name='SearchResponse'
    )
    def Search(ctx, criterias):
        # pass
        # TODO: implement the logic

Тем не менее, при таком подходе я получаю такой результат:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ava="http://..." xmlns:book="...">
   <soapenv:Header/>
   <soapenv:Body>
      <ava:SearchRequest>
         <!--Zero or more repetitions:-->
         <ava:Criteria>
            <!--Optional:-->
            <book:id>?</book:id>
            <book:LocationIds>?</book:LocationIds>
            <book:Type>?</book:Type>
         </ava:Criteria>
      </ava:SearchRequest>
   </soapenv:Body>
</soapenv:Envelope>

Это пользовательская модель, которую я должен реализовать здесь?

Заранее большое спасибо!


person chickahoona    schedule 23.08.2019    source источник


Ответы (1)


Я смог решить это. Этот «id» называется атрибутом.

я заменил

class CriteriaModel(ComplexModel):
    id = String
    LocationIds = String
    Type = String

с:

class CriteriaModel(ComplexModel):
    id = XmlAttribute(String)
    LocationIds = String
    Type = String

И это отображается как:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ava="http://..." xmlns:book="...">
   <soapenv:Header/>
   <soapenv:Body>
      <ava:SearchRequest>
         <!--Zero or more repetitions:-->
         <ava:Criteria id="?">
            <!--Optional:-->
            <book:LocationIds>?</book:LocationIds>
            <book:Type>?</book:Type>
         </ava:Criteria>
      </ava:SearchRequest>
   </soapenv:Body>
</soapenv:Envelope>
person chickahoona    schedule 27.08.2019