Запрос через Zeep с несколькими тегами с тем же именем - PullRequest
0 голосов
/ 15 октября 2019

Добрый вечер! Сразу прошу прощения за плохой английский.

У меня возникла проблема при отправке вложенных полей с одинаковым именем через zeep, zeep игнорирует все поля и отправляет только последнее.

У меня такойфункция для библиотеки Zeep,

def send_data(self, data):
    response = self.client.service.GetAddrLetter(
       Key = '12345',
       AddrInfo={'RcpnName': data['recipient_name'],
                 'RcpnIndex': data['recipient_index'],
                 'RcpnPhone': data['recipient_phone'],
                 'RcpnEmail': 'my@mail.mail',
                 'RcpnStreet': data['recipient_address'],
                 'SndrName': data['sender_name'],
                 'SndrPhone': data['sender_phone'],
                 'SndrIndex': data['sender_index'],
                 'SndrStreet': data['sender_address'],
                 'AddInfo':{'Field': data['request_order'], 'Field': data['old_order'], 'Field': data['new_order']},               
        )
        return response

Данные - это словарь данных, из которого я беру значения и отправляю их в службу.

Вот как выглядит рабочий запрос, отправляя этот запрос черезв браузере или мылом все поля отлично обработаны.

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:pos="blabla">
    <soapenv:Header/>
   <soapenv:Body>
        <pos:GetAddrLetterRequest>
            <pos:Key>1234567</pos:Key>
         <pos:AddrInfo>
            <!--Optional:-->
            <pos:RcpnName>Name Name</pos:RcpnName>
            <pos:RcpnPhone>123456</pos:RcpnPhone>
            <!--Optional:-->
            <pos:RcpnEmail>mail@mail</pos:RcpnEmail>
            <pos:RcpnStreet>my street</pos:RcpnStreet>
            <pos:SndrName>shop_name</pos:SndrName>
            <pos:SndrPhone>123456</pos:SndrPhone>
            <pos:SndrStreet>my street</pos:SndrStreet>
            <!--Optional:-->
            <pos:AddInfo>
            <!--0 to 5 repetitions:-->
               <pos:Field>111</pos:Field>
               <pos:Field>222</pos:Field>
              <pos:Field>333</pos:Field>
            </pos:AddInfo>
         </pos:AddrInfo>
      </pos:GetAddrLetterRequest>
   </soapenv:Body>
</soapenv:Envelope>

1 Ответ

1 голос
/ 16 октября 2019

Добрый вечер, после долгих часов мучений я решил эту проблему, не могу сказать, что мое решение элегантное или правильное, но оно работает, и это сейчас для меня самое главное.

Я изучил эту часть руководства в библиотеке, но, увы, ни одно из решений для вложенных тегов не помогло мне

Затем я сделал следующее, я простовытащил из словаря нужные мне поля и с помощью конкатенации добавил его в нужное мне поле.

def send_data(self, data):
    request_order = str(data['request_order'])
    old_order = str(data['old_order'])
    new_order = str(data['new_order'])
    field_value = request_order + '\n' + old_order + '\n' + new_order
    response = self.client.service.GetAddrLetter(
       Key = '12345',
       AddrInfo={'RcpnName': data['recipient_name'],
                 'RcpnIndex': data['recipient_index'],
                 'RcpnPhone': data['recipient_phone'],
                 'RcpnEmail': 'my@mail.mail',
                 'RcpnStreet': data['recipient_address'],
                 'SndrName': data['sender_name'],
                 'SndrPhone': data['sender_phone'],
                 'SndrIndex': data['sender_index'],
                 'SndrStreet': data['sender_address'],
                 'AddInfo':{'Field': field_value },               
        )
        return response

Теперь все работает, прошу прощения за плохой код, я просто младший разработчик, надеюсьэто может быть кому-то полезно

...