Tôi đã triển khai mô-đun API theo dõi Pivotal trong Python 2.7. Pivotal Tracker API dự kiến dữ liệu POST là một tài liệu XML và "application/xml" là loại nội dung.Làm cách nào để đăng ký tự không phải ASCII bằng cách sử dụng httplib khi loại nội dung là "application/xml"
Mã của tôi sử dụng urlib/httplib để gửi tài liệu như:
request = urllib2.Request(self.url, xml_request.toxml('utf-8') if xml_request else None, self.headers)
obj = parse_xml(self.opener.open(request))
Điều này mang lại một ngoại lệ khi văn bản XML chứa các ký tự phi 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)
Như gần như tôi có thể xem, httplib._send_output đang tạo một chuỗi ASCII cho tải trọng tin nhắn, có lẽ vì nó hy vọng dữ liệu được mã hóa URL (application/x-www-form-urlencoded). Nó hoạt động tốt với ứng dụng/xml miễn là chỉ sử dụng các ký tự ASCII.
Có cách nào đơn giản để đăng dữ liệu ứng dụng/xml chứa ký tự không phải ASCII hay tôi sẽ phải nhảy qua các vòng (ví dụ: sử dụng Twistd và nhà sản xuất tùy chỉnh cho tải trọng POST)?
Có lẽ bạn có thể thay đổi 'loại nội dung' của tiêu đề, nhưng cách này khắc phục được sự cố? 'Msg' được xây dựng trong thư viện python và là chuỗi byte. – jro
@jro: Nó không liên quan gì đến HTTP. Hãy xem ví dụ * hoàn chỉnh * ở trên. – jfs
Tôi hiểu rằng điều này gây ra vấn đề, nhưng quan điểm của tôi là anh ta không kiểm soát biến 'msg'. Tôi đồng ý với quan điểm của bạn, nhưng câu hỏi của tôi là nhiều hơn trong dòng của thực tế này có thể giúp anh ta để giải quyết nó khi trong libs 'msg' được tạo ra như là' msg = "\ r \ n" .join (self._buffer) '? – jro