我在 Python 2.7 中实现了一个 Pivotal Tracker API 模块。Pivotal Tracker API要求 POST 数据为 XML 文档,“application/xml”为内容类型。
我的代码使用 urllib/httplib 来发布文档,如下所示:
request = urllib2.Request(self.url, xml_request.toxml('utf-8') if xml_request else None, self.headers)
obj = parse_xml(self.opener.open(request))
当 XML 文本包含非 ASCII 字符时,这会产生异常:
File "/usr/lib/python2.7/httplib.py", line 951, in endheaders
self._send_output(message_body)
File "/usr/lib/python2.7/httplib.py", line 809, in _send_output
msg += message_body
exceptions.UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 89: ordinal not in range(128)
据我所见,httplib._send_output 正在为消息有效负载创建一个 ASCII 字符串,大概是因为它希望数据是 URL 编码的(application/x-www-form-urlencoded)。只要只使用 ASCII 字符,它就可以与 application/xml 一起正常工作。
是否有一种直接的方法来发布包含非 ASCII 字符的应用程序/xml 数据,或者我将不得不跳过箍(例如,使用 Twistd 和 POST 有效负载的自定义生产者)?