首页 文章

在Python中传递soap信封在urllib上工作但不在请求上工作

提问于
浏览
0

我正在使用urllib在Python2中传递一个soap信封,它工作正常,但在升级到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 /请求中的实际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的输出正如我发送的那样(见下文),这让我觉得在请求中发生了一些事情正在改变我的 Headers ,这就是搞砸了一切 . 思考?任何帮助将不胜感激:

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

1 回答

  • 0

    哇...我一发布我的问题就明白了:显然 Headers 不能简单地成为请求的位置参数,就像它们可以在urllib中一样 - 你必须指定 headers= 并瞧!

    我改变了这个: request = requests.post(self._url, xml, request_headers)

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

    它只是工作 .

相关问题