簡體   English   中英

在Python中傳遞soap信封可在urllib上使用,但不能在請求上使用

[英]passing soap envelope in Python works on urllib but not on requests

我使用urllib在Python2中傳遞了一個肥皂信封,它工作正常,但是在升級到Python3和請求后,事務失敗。 失敗的具體錯誤是:“服務器不支持該請求,因為不支持媒體類型。” 這是每個的內容/命令:

python2 / urllib

request = urllib2.Request(self._url, xml, request_headers)

每個變量的內容

self._url:

https://cert.api2.heartlandportico.com/Hps.Exchange.PosGateway/PosGatewayService.asmx?wsdl

XML文件

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><PosRequest xmlns="http://Hps.Exchange.PosGateway"><Ver1.0><Header><SecretAPIKey>skapi_cert_MYl2AQAowiQxxxxxxxizOP2jcX9BrEMqQ</SecretAPIKey><DeveloperID>000000</DeveloperID><VersionNbr>0000</VersionNbr></Header><Transaction><CreditSale><Block1><AllowDup>Y</AllowDup><AllowPartialAuth>N</AllowPartialAuth><Amt>1.15</Amt><CardHolderData><CardHolderFirstName>evan</CardHolderFirstName><CardHolderLastName>stone</CardHolderLastName><CardHolderPhone>9405947406</CardHolderPhone><CardHolderAddr>417 Neverland</CardHolderAddr><CardHolderCity>Denton</CardHolderCity><CardHolderState>TX</CardHolderState><CardHolderZip>76209</CardHolderZip></CardHolderData><CardData><TokenData><TokenValue>supt_kMKxxxxxxQacvPDvZNa</TokenValue><CardPresent>N</CardPresent><ReaderPresent>N</ReaderPresent></TokenData><TokenRequest>N</TokenRequest></CardData></Block1></CreditSale></Transaction></Ver1.0></PosRequest></soap:Body></soap:Envelope>

request_headers

{'Content-length': '1110', 'Content-type': 'text/xml; charset=UTF-8'}

Python3 /要求

request = requests.post(self._url, xml, request_headers)

每個變量的內容

(同上)

注意:

Python3 / requests中的實際request.headers.headers(顯示已發送的標頭)使其看起來好像我的標頭字典被完全忽略了,除了關於長度的一個變量:

{'User-Agent': 'python-requests/2.10.0', 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '1110', 'Connection': 'keep-alive'}

在Python2 / urllib中,request.headers的輸出正是我發送的(請參見下文),這使我認為請求中發生了某些事情,這些改變了我的標頭,而這正是所有事情的根源。 有什么想法嗎? 任何幫助將不勝感激:

{'Content-length': '1110', 'Content-type': 'text/xml; charset=UTF-8'}

哇...我一問我就想出了:顯然標頭不能像urllib中那樣簡單地作為請求中的位置參數-您必須指定headers=和voila!

我改變了這個: request = requests.post(self._url, xml, request_headers)

對此: request = requests.post(self._url, xml, headers=request_headers)

它只是工作。

暫無
暫無

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

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