如何在Python 3 urllib的soap信封中编码值? (Re:TypeError POST数据应该是字节)

时间:2016-07-19 18:41:55

标签: soap python-3.4 urllib

我知道在Python3上的urllib中发送的数据需要进行urlencoded,我在此处研究了其他答案,例如this onethis one以及this one。这些解决方案中的每一个都显示了在传递给urllib之前被urlencoded的数据的字典。然而,我的数据是一个巨大的肥皂信封,我不知道哪个是urlencode。

以下是我遇到的代码:

        xml = str(Et.tostring(envelope), 'utf-8')
        if self._logging:
            print('URL: ' + self._url)
            print('Request: ' + xml)

        request_headers = {'Content-type': 'text/xml; charset=UTF-8',
                           'Content-length': str(len(xml))}
        request = urllib.request.Request(self._url, xml, request_headers)
        raw_response = urllib.request.urlopen(request).read()

完整代码为here.以下是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_MYl2AQAowiQAbLp5JesGKh7QFkcizOP2jcX9BrEMqQ</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>627 Woodland</CardHolderAddr><CardHolderCity>Denton</CardHolderCity><CardHolderState>TX</CardHolderState><CardHolderZip>76209</CardHolderZip></CardHolderData><CardData><TokenData><TokenValue>supt_eaztSD0E0uc3SOcdsiRf9ney</TokenValue><CardPresent>N</CardPresent><ReaderPresent>N</ReaderPresent></TokenData><TokenRequest>N</TokenRequest></CardData></Block1></CreditSale></Transaction></Ver1.0></PosRequest></soap:Body></soap:Envelope>

注意:我还通过xml手动将此xml = xml.encode('utf-8')变量转换为字节对象,只是为了传递一个bytes对象。显然,这并没有成功。我在PyCharm调试器中跟踪它的路径,它再次变成了一个字符串,我得到了同样的错误:

“TypeError:POST数据应该是字节或可迭代的字节。它不能是str类型。”

0 个答案:

没有答案