Python请求模块,需要对主体进行编码,为什么?
我正在努力使用requests模块向web服务发送请求。我在Windows上使用的是Python 3.5.1-32位 每当我请求包含拉丁重音字符(如“á”)的内容时,我都需要将字符串变量显式编码为utf-8。有人能解释一下我为什么要这么做吗 下面是我的代码示例:Python请求模块,需要对主体进行编码,为什么?,python,python-3.x,request,Python,Python 3.x,Request,我正在努力使用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, da
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是这样的,我花了很长时间才弄明白这一点。请求医生说:
:param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
在Python 3中,body='á'是一个unicode字符串。使用方法encode()
将其转换为字节
对于unicode字符串,请求将其理解为文件内容,并使用八位字节流/base64进行编码。虚假内容将被转移
p/S:它仅适用于Python 3
str
不同,实际上它不应该是必需的。我总是发送str(),从不发送bytes()。谢谢,我有点理解。我假设python3i中的unicode==utf-8存在完全相同的问题。如何解决Python 2的问题?@kev如果不查看代码的某些部分,很难解决您的问题。