Spyne пользовательский ответ XML - PullRequest
0 голосов
/ 25 января 2019

Я использую Spyne с Django CMS. Веб-служба звонит моей системе, и я хочу ответить ниже. Могу ли я использовать Spyne для настройки ответа? Или я должен пройти через модели?

Пожалуйста, сообщите.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
 <soapenv:Header/>
 <soapenv:Body>
<tns:initTestQueryResponse xmlns:tns="http://test.com/interface/test/v2"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://test.com/interface/test/v2 testQuery.xsd"
    xmlns:v21="http://test.com/model/generic-query/v2"
    xmlns:v22="http://test.com/model/common/v2">
    <tns:field key="ID" type="ID">
        <v21:description lang="en">Identifier</v21:description>
    </tns:field>
    <tns:field key="CUSTOMER_NAME" type="TEXT">
        <v21:description lang="en">Customer Name</v21:description>
        <v21:layoutOptions bold="true" italic="false" direction="HORIZONTAL"/>
    </tns:field>
    <tns:section key="CUSTOMER">
        <v21:description lang="en">Customer</v21:description>
    </tns:section>
    <tns:advancedQuery>
        <tns:criteriaGroup key="CUSTOMER" operator="OR">
            <v21:criterion key="ID" />
            <v21:criterion key="CUSTOMER_NAME" />
        </tns:criteriaGroup>
    </tns:advancedQuery>
    <tns:advanceQueryPerson>
        <tns:criteriaGroup key="CUSTOMER" operator="OR">
            <v21:criterion key="ID" />
            <v21:criterion key="CUSTOMER_NAME" />
        </tns:criteriaGroup>
    </tns:advanceQueryPerson>
    <tns:context>
        <v22:status>OK</v22:status>
    </tns:context>
</tns:initTestQueryResponse>
</soapenv:Body>
</soapenv:Envelope>

Это запрос

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
      <p:initTestQueryRequest xmlns:p="http://test.com/interface/test/v2"
                             xmlns:p1="http://test.com/model/common/v2"
                             xmlns:p2="http://test.com/model/generic-query/v2"
                             xmlns:p3="http://test.com/model/test/v2"
                             xmlns:p4="http://test.com/model/service-fault/v2"
                             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                             xsi:schemaLocation="http://test.com/interface/test/v2 ../service/test/v2/TestQuery.xsd "
                             xsi:type="anyType"/>
   </soapenv:Body>
</soapenv:Envelope>

1 Ответ

0 голосов
/ 27 января 2019

У вас есть две опции:

  1. Используйте пустой метод с именем initTestQuery, тип возвращаемого значения которого должен быть классом с именем "initTestQueryResponse", чье пространство имен равно "http://test.com/interface/test/v2".. Вам необходимовернуть экземпляр initTestQueryResponse из функции initTestQuery.

  2. Использовать простой метод с именем "initTestQuery", тип возвращаемого значения которого AnyXml. Вам необходимо вернуть lxml.etree.Element (), который содержит необходимые теги. Пожалуйста, обратитесь к документации lxml о том, как это сделать.

Если вы хотите «редактировать» запросы после их десериализации, но перед их проверкой, выдолжен наследовать протокол и переопределять create_in_document.

class MyProtocol(Soap11):
    def create_in_document(self, ctx, charset=None):
        super(MyProt, self).create_in_document(ctx, charset=charset)
        # Do whatever you want with ctx.in_document


app = Application(in_protocol=MyProtocol(...), ...)

Надеюсь, это поможет.

...