我知道在Python3上的urllib中发送的数据需要进行urlencoded,我在此处研究了其他答案,例如this one和this 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类型。”