Последние несколько недель я изучал 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