Python Spyne, возврат с массивом - PullRequest
0 голосов
/ 16 ноября 2018

Я работаю со Spyne 2.12.14 в Python 2.7 и Django 1.9 Я хочу вернуть ответ, подобный этому:

?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

<soapenv:Header/>
    <soapenv:Body>
        <ns2:GetResponse xmlns:ns2="http://test.example.com/test">
            <return>
                <myHeader>
                    <id>1234abc</id>
                    <code>000</code>
                    <message>Success</message>
                </myHeader>
                <MyDetail>
                    <item1>myItem1</item1>
                    <item2>myItem2</item2>
                </MyDetail>
                <MyDetail>
                    <item1>myItem1</item1>
                    <item2>myItem2</item2>
                </MyDetail>
            </return>
        </ns2:GetResponse>
    </soapenv:Body>
</soapenv:Envelope>

но получите этот ответ:

?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

<soapenv:Header/>
    <soapenv:Body>
        <ns2:GetResponse xmlns:ns2="http://test.example.com/test">
            <return>
                <myHeader>
                    <id>1234abc</id>
                    <code>000</code>
                    <message>Success</message>
                </myHeader>
                <MyDetail>
                    <MyDetail>
                        <item1>myItem1</item1>
                        <item2>myItem2</item2>
                    </MyDetail>
                    <MyDetail>
                        <item1>myItem1</item1>
                        <item2>myItem2</item2>
                    </MyDetail>
                </MyDetail>
            </return>
        </ns2:GetResponse>
    </soapenv:Body>
</soapenv:Envelope>

Это мой код:

class MyHeader(ComplexModel):
    __namespace__ = 'http://test.example.com/test'
    INHERITANCE = None,
    INDICATOR = Sequence,
    _type_info = {
        'id': String,
        'code': String,
        'message': String,
    }

class MyDetail(ComplexModel):
    __namespace__ = 'http://test.example.com/test'
    INHERITANCE = None,
    INDICATOR = Sequence,
    _type_info = {
        'item1': String,
        'item2': String,
    }

class GetResponse(ComplexModel):
    INHERITANCE = None,
    INDICATOR = Sequence,
    _type_info = {
        'myHeader': MyHeader,
        'MyDetail': Array(MyDetail, minOccurs=0, maxOccurs='unbounded')
    }

@rpc(MyObject, _returns=[GetResponse], _out_variable_names=["return"])

    def GetMiniStatement(ctx, MyObjectInfo):
            do_something

Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

измените мое объявление на «MyDetail»: Array (MyDetail, maxOccurs = «unbounded», wrapped = False), и оно работает.

0 голосов
/ 18 ноября 2018

Вам нужен необёрнутый массив.

Удалить это:

     'MyDetail': Array(MyDetail, minOccurs=0, maxOccurs='unbounded')

Добавить это:

     'MyDetail': MyDetail.customize(minOccurs=0, maxOccurs='unbounded')

Кроме того, ваше определение массива кажется странным, поскольку, устанавливая для maxOccurs типа Array значение больше 1, вы создаете необернутый массив из упакованного массива, который не выглядит нравится то, что вы хотите. (другими словами, вы говорите Spyne, что тип Array может встречаться более одного раза, а не то, что внутри него.)

...