在Python中传递soap信封对urlib有效,但对请求无效



我在Python2中传递了一个带有urlib的soap信封,它运行良好,但在升级到Python3并请求后,事务失败。失败的具体错误是,"服务器无法为请求提供服务,因为媒体类型不受支持。"以下是每个请求的内容/命令:

Python2/urlib

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

每个变量的内容

自我_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>

请求标头

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

Python 3/请求

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

每个变量的内容

(同上)

注:

Python3/requests中实际的request.headers.headers(显示发送的标头)使我的标头dict看起来像是被完全忽略了,除了关于长度的一个变量:

{'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)

它只是起了作用。

相关内容

  • 没有找到相关文章

最新更新