![](/img/trans.png)
[英]Change xmlns:wsse namespace in SOAP request with Python Zeep
[英]zeep soap12 wsdl+mtom+wsse how to make request?
TPA.wsdl https://pastebin.com/7DBhCHbv DataService.xsd https://pastebin.com/AFhg64hH
from zeep import Client
import base64
from requests import Session
from zeep.wsse.username import UsernameToken
from zeep.transports import Transport
from zeep.exceptions import Fault
Username = '....'
Password = '....'
sendFile = 'V07_220110.ffdata'
session = Session()
session.verify = False
try:
wsdl = 'TPA.wsdl'
# initialize zeep client
client = Client(
wsdl=wsdl,
wsse=UsernameToken(Username, Password),
transport=Transport(session=session)
)
with open(sendFile, "rb") as pdf_file:
encoded_string = base64.b64encode(pdf_file.read())
with client.options(raw_response=True):
node = client.service.uploadEdasDraft(sendFile, encoded_string )
print(node.content)
except Fault as fault:
parsed_fault_detail = client.wsdl.types.deserialize(fault.detail[0])
總是得到回應
我收到錯誤 ORA-31011: XML 解析失敗
從 SOAPUI 一切都可以通過啟用 MTOM 設置發送
那么如何向它發出請求,以及如何調試發送請求呢?
基於該 WSDL 文件,代碼如下:
from zeep import Client
from zeep.wsse.username import UsernameToken
username = 'username'
password = 'p@$$word'
file_name = 'test.txt'
client = Client(wsdl = 'TPA.wsdl',
wsse = UsernameToken(username, password))
with open(file_name, "rb") as f:
content = f.read()
client.service.uploadEdasDraft(file_name, content)
應該產生這樣的東西:
<soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope">
<soap-env:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>username</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">p@$$word</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soap-env:Header>
<soap-env:Body>
<ns0:uploadEdasDraft xmlns:ns0="http://types.data.external.ws.edas.sodra.epr.lt">
<fileName>test.txt</fileName>
<document>dGhpcyBpcyBhIHRlc3QNCnRoaXMgaXMgYSB0ZXN0DQp0aGlzIGlzIGEgdGVzdA0KdGhpcyBpcyBhIHRlc3QNCg==</document>
</ns0:uploadEdasDraft>
</soap-env:Body>
</soap-env:Envelope>
由於文檔類型標記為xsd:base64Binary
zeep 應該為您處理 base64 編碼(您的代碼似乎進行了兩次編碼)。
在上面的示例中,我使用的是文本文件,但我假設名為V07_220110.ffdata
的文件是 XML 文件,因為這就是該屬性所說的: xmime:expectedContentTypes="application/xml"
。 如果您不發送具有此內容類型的文件,服務器可能會抱怨。 這也可能是“ORA-31011:XML 解析失敗”消息以及雙重編碼的可能原因(服務器期望文檔中出現 XML,但找到另一個 Z95A1446A7120E4AF5CZ0C8 字符串)。
從 SOAPUI 一切都可以通過啟用 MTOM 設置發送
使用 MTOM 時,您的文件不會在 SOAP 消息中編碼為文本,而是作為二進制文件附加在其旁邊,並且您會獲得對該部分消息的引用。 在這里查看解釋: MTOM 是如何工作的?
您的文檔元素可能會更改為:
<document>
<inc:Include href="cid:123456789" xmlns:inc="http://www.w3.org/2004/08/xop/include"/>
</document>
其中123456789
是對多部分消息中內容 ID 的引用。
僅當您啟用 MTOM 時,您的呼叫是否可以從 SoapUI 工作? 您是否嘗試過使用 SoapUI 在 SOAP 消息中發送 base64 編碼文件字符串?
如果您的呼叫僅適用於 MTOM,那么您就有問題了,因為我不確定 zeep 是否可以開箱即用地處理它。
文檔( https://docs.python-zeep.org/en/master/attachments.html )僅提到了多部分響應以及如何從響應中讀取文件,但沒有提及提出請求。 例如,請參閱以下項目:
最后一個項目可能會幫助您處理一些代碼示例( https://github.com/remaudcorentin-dev/python-zeep-adv/blob/master/src/zeep/transport_with_attach.py ),但請考慮以下警告:
這是為特定用途開發的,此代碼可能不應該用於(擁有它)用於其他用途。 (或您自擔風險;))
因此,您似乎必須從頭開始或從項目中的該示例構建自己的多部分請求。
[...] 以及如何調試發送請求?
您可能會使用HistoryPlugin來查看客戶端和服務器之間交換了哪些消息,但由於您可能需要查看所有請求,因此我建議使用Wireshark 、 TcpMon (舊的、已失效但仍然有用)或帶有 TcpMon 的 SoapUI 。
這可能不是您正在尋找的答案,但希望至少它能讓您更有能力弄清楚如何撥打電話。 不幸的是,Zeep 是WS 規格大池塘中的小魚客戶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.