Python的requests模块,为什么需要对请求体(body)进行编码?

7

我遇到了一个问题,使用requests模块发送请求到一个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 技术水平较低,花了好一会儿才弄明白这个。


实际上这是不必要的。我总是发送str()而不是bytes()。 - Maresh
1个回答

5

requests文档中写道:

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

在Python 3中,body='á' 是一个Unicode字符串。使用encode()方法将其转换为字节。
对于Unicode字符串,requests将其视为文件内容并使用octet-stream/base64进行编码。错误的内容将被传输。
注:此仅适用于Python 3。Python 2中的str与Python 3中的str不同。

谢谢,我有点理解了。我假设在Python 3中unicode等同于utf-8。 - Roger Davies
我有完全相同的问题。我该如何在Python 2中解决它? - kev
@kev,如果没有看到你代码的某些部分,很难解决你的问题。 - qvpham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接