Spyne custom XML response

喜你入骨 提交于 2020-03-05 01:58:13

问题


I am using Spyne with Django CMS. A web service is calling my system and I want to reply with the below. Can I use Spyne for customize response? Or do I have to go through models?

Please advise.

<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>

This the request

<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:


You have two options:

  1. Use a bare method named initTestQuery whose return type should be a class named "initTestQueryResponse" whose namespace is "http://test.com/interface/test/v2". You need to return an initTestQueryResponse instance from the initTestQuery function.

  2. Use a bare method named "initTestQuery" whose return type is AnyXml. You need to return an lxml.etree.Element() that contains the tags you need. Please consult the lxml documentation about how to do that.

If you want to "edit" requests after they are deserialized but before they are validated, you must subclass the protocol and override 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(...), ...)

I hope this helps.



来源:https://stackoverflow.com/questions/54362850/spyne-custom-xml-response

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!