簡體   English   中英

zeep soap12 wsdl+mtom+wsse 如何提出請求?

[英]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來查看客戶端和服務器之間交換了哪些消息,但由於您可能需要查看所有請求,因此我建議使用WiresharkTcpMon (舊的、已失效但仍然有用)或帶有 TcpMon 的 SoapUI

這可能不是您正在尋找的答案,但希望至少它能讓您更有能力弄清楚如何撥打電話。 不幸的是,Zeep 是WS 規格大池塘中的小魚客戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM