Отправить XML с вложением в SOAP с помощью Python - PullRequest
0 голосов
/ 25 июня 2018

Последние несколько недель я изучал Python и пытался отправить пользовательский XML на общедоступный тестовый WS.Прямо сейчас я чувствую, что я не делаю никакого прогресса.Поэтому мне нужна помощь или какой-либо совет для моей текущей ситуации.

Мы будем запрашивать следующий код, если вы анализируете его с помощью SoapUI или других методов (я пробовал -mzeep).

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.sunat.gob.pe">    <soapenv:Header/>    <soapenv:Body>
      <ser:sendBill>
         <!--Optional:-->
         <fileName>?</fileName>
         <!--Optional:-->
         <contentFile>?</contentFile>
         <!--Optional:-->
         <partyType>?</partyType>
      </ser:sendBill>    </soapenv:Body> </soapenv:Envelope>

Но для WS действительно необходим XML-код, подобный следующему:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ser="http://service.sunat.gob.pe" xmlns:wsse="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <soapenv:Header>
        <wsse:Security>
            <wsse:UsernameToken>
                <wsse:Username>?</wsse:Username>
                <wsse:Password>?</wsse:Password>
            </wsse:UsernameToken>
        </wsse:Security>
    </soapenv:Header>
    <soapenv:Body>
        <ser:sendBill>
            <fileName>?</fileName>
            <contentFile>?</contentFile>
        </ser:sendBill>
    </soapenv:Body>
</soapenv:Envelope>

Является значением <contentFile>, zip-файлом, закодированным в base64 и содержащим XML-файл.Документация WS специально требует, чтобы это поле было закодировано следующим образом:

-Создать структуру XML с реальными данными.-Вложить его в .zip -код, который .zip в формате base64 -Finaly присоединить его в XML

До сих пор я дошел до момента отправки пользовательского XML на WS.Если я делаю это с помощью SoapUI, он работает нормально, так как обнаруживает недопустимое значение, которое я поместил в XML внутри zip-кода, закодированного в base64 (он возвращает отображенную ошибку, говорящую «недопустимое значение»).Но если я пытаюсь использовать его с помощью Python, я получаю сообщение об ошибке от того WS, который не отображается в списке ошибок, который выдает поставщик WS.

Это мой код.Что я и делал, читая документацию Zeep, а также прося помощи у людей из Python's Discord.

from zeep import Client, Settings
from zeep.wsse.username import UsernameToken

import base64

with open("20100066603-01-F001-1.zip", "rb") as f:
    bytes = f.read()
    encoded = base64.b64encode(bytes)


settings = Settings(strict=False, xml_huge_tree=True)
wsdl = 'https://e-beta.sunat.gob.pe/ol-ti-itcpfegem-beta/billService?wsdl'
client = Client(wsdl=wsdl, wsse=UsernameToken('20100066603MODDATOS', 'moddatos'), settings=settings)

node = client.create_message(client.service.sendBill('20100066603-01-F001-1.zip', encoded))

# response = client.service.sendBill('20100066603-01-F001-1.zip', b'bytes')
# print(client.service.sendBill('20100066603-01-F001-1.zip', b'encoded'))
# print(client.service.sendBill('20100066603-01-F001-1.zip', encoded))
# print(encoded.decode())
print(node)

Я хочу знать, правильно ли то, что я делаю на Python.Я хотел бы получить XML-ответ, который WS доставит при отправке этих тестовых данных.(моя цель - получить то же сообщение об ошибке, что и при отправке запроса через SoapUI). Я решил использовать Zeep, потому что это была самая хорошо документированная библиотека для SOAP-запроса, которую я мог найти.Как я уже говорил, я новичок в Python, и мне действительно нужно использовать этот WS.Если это дублированный вопрос, пожалуйста, дайте мне знать.Или, если на этот вопрос можно ответить с другими вопросами, пожалуйста, свяжите меня с ними.Проводя некоторые исследования о Zeep, я заметил, что некоторые люди говорят, что Zeep не любит вложения (его поддержка вложения не очень хорошая).Поэтому я хотел бы знать, есть ли другая библиотека, которую я мог бы использовать.Если да, пожалуйста, не могли бы вы показать мне пример?Если нет, вы бы порекомендовали мне другой язык программирования и его библиотеки, где я могу успешно это сделать. Это мой первый вопрос о StackO.Кстати, не беспокойтесь о данных usernameToken в коде pyhthon, это вымышленные данные.Я сделал запрос с использованием библиотеки запросов и получил XML, в котором говорится, что произошла внутренняя ошибка сервера.Но я просто спрашиваю у провайдера, и их WS работает нормально.Я мог бы подтвердить это, выполнив запрос с помощью SoapUI и получив ожидаемую ошибку.Извините, если это было долго.Заранее спасибо.Jajdp

1 Ответ

0 голосов
/ 10 августа 2018

Кто бы мог подумать, что библиотеки для отправки данных в SOAP обычно кодируют ваши файлы на base64 автоматически.Весь код, который я сделал, был правильным, но единственной частью.Вместо:

node = client.create_message(client.service.sendBill('20100066603-01-F001-1.zip', encoded))

должно быть

node = client.create_message(client.service.sendBill('20100066603-01-F001-1.zip', bytes))

Теперь сценарии работают правильно!

...