Python请求模块,需要对身体进行编码,为什么?

时间:2016-05-27 11:05:48

标签: python python-3.x request

我正在努力使用请求模块向Web服务发送请求。我在Windows上使用Python 3.5.1-32位。

每当我请求包含拉丁语重音字符(例如“á”)的内​​容时,我需要将我的字符串变量显式编码为utf-8。有人可以解释为什么我需要这样做吗?

这是我的代码示例:

import requests

headers = { "content-type" : "text/xml;charset=UTF-8" }
url = '....'
body = 'á'
requests.post(url, data=body, headers=headers)

这不起作用,服务器收到该角色的转义版本,但如果我在请求之前添加此内容:

body = body.encode(encoding='utf-8')

有效。

有人可以解释为什么这是必要的吗?我的Python-Fu是这样的,我花了很长时间来解决这个问题。

1 个答案:

答案 0 :(得分:2)

请求 doc说:

:param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.

Python 3 body='á'中是一个unicode字符串。使用方法encode(),您将其转换为字节。

对于unicode字符串,请求将其理解为文件内容,并使用 octet-stream / base64 进行编码。虚假内容将被转移。

P / S:仅适用于 Python 3 。 Python 2的str与Python 3中的str不一样