Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当python请求post数据为字符串类型时,默认的编码是什么?_Python_Python Requests - Fatal编程技术网

当python请求post数据为字符串类型时,默认的编码是什么?

当python请求post数据为字符串类型时,默认的编码是什么?,python,python-requests,Python,Python Requests,使用以下代码 payload='' 工作报告 总体情况:良好 ''' r=请求。post(“http://httpbin.org/post“,数据=有效载荷) 当请求post数据为字符串类型时,默认编码是什么?UTF8还是unicode转义码 如果我想指定编码类型,我是否必须自己编码并将字节对象传递给参数“data”?如果您真的尝试您的示例,您会发现: $ python Python 3.7.2 (default, Jan 29 2019, 13:41:02) [Clang 10.0.0

使用以下代码

payload=''
工作报告 
总体情况:良好 
'''
r=请求。post(“http://httpbin.org/post“,数据=有效载荷)
当请求post数据为字符串类型时,默认编码是什么?UTF8还是unicode转义码


如果我想指定编码类型,我是否必须自己编码并将字节对象传递给参数“data”?

如果您真的尝试您的示例,您会发现:

$ python
Python 3.7.2 (default, Jan 29 2019, 13:41:02) 
[Clang 10.0.0 (clang-1000.10.44.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> payload = '''
...  工作报告 
...  总体情况:良好 
... '''
>>> r = requests.post("http://127.0.0.1:8888/post", data=payload)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/tmp/venv/lib/python3.7/site-packages/requests/api.py", line 116, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/tmp/venv/lib/python3.7/site-packages/requests/api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "/tmp/venv/lib/python3.7/site-packages/requests/sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "/tmp/venv/lib/python3.7/site-packages/requests/sessions.py", line 646, in send
    r = adapter.send(request, **kwargs)
  File "/tmp/venv/lib/python3.7/site-packages/requests/adapters.py", line 449, in send
    timeout=timeout
  File "/tmp/venv/lib/python3.7/site-packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/tmp/venv/lib/python3.7/site-packages/urllib3/connectionpool.py", line 354, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/tmp/venv/lib/python3.7/http/client.py", line 1229, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/tmp/venv/lib/python3.7/http/client.py", line 1274, in _send_request
    body = _encode(body, 'body')
  File "/tmp/venv/lib/python3.7/http/client.py", line 160, in _encode
    (name.title(), data[err.start:err.end], name)) from None
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 2-5: Body ('工作报告') is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8.
$python
Python 3.7.2(默认值,2019年1月29日,13:41:02)
关于达尔文的[Clang 10.0.0(Clang-1000.10.44.4)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入请求
>>>有效载荷=“”
...  工作报告 
...  总体情况:良好 
... '''
>>>r=请求。post(“http://127.0.0.1:8888/post“,数据=有效载荷)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/tmp/venv/lib/python3.7/site packages/requests/api.py”,第116行,在post中
返回请求('post',url,data=data,json=json,**kwargs)
文件“/tmp/venv/lib/python3.7/site packages/requests/api.py”,第60行,请求中
return session.request(method=method,url=url,**kwargs)
文件“/tmp/venv/lib/python3.7/site packages/requests/sessions.py”,请求中的第533行
resp=自我发送(准备,**发送)
文件“/tmp/venv/lib/python3.7/site packages/requests/sessions.py”,第646行,在send中
r=适配器.send(请求,**kwargs)
文件“/tmp/venv/lib/python3.7/site packages/requests/adapters.py”,第449行,在send中
超时=超时
文件“/tmp/venv/lib/python3.7/site packages/urllib3/connectionpool.py”,第600行,在urlopen中
分块=分块)
文件“/tmp/venv/lib/python3.7/site packages/urllib3/connectionpool.py”,第354行,在请求中
conn.request(方法,url,**httplib\u request\u kw)
请求中的文件“/tmp/venv/lib/python3.7/http/client.py”,第1229行
self.\u发送\u请求(方法、url、正文、标题、编码\u分块)
文件“/tmp/venv/lib/python3.7/http/client.py”,第1274行,在发送请求中
body=_编码(body,'body')
文件“/tmp/venv/lib/python3.7/http/client.py”,第160行,编码为
(name.title(),数据[err.start:err.end],name]),来自None
UnicodeEncodeError:“latin-1”编解码器无法对位置2-5:Body('s)中的字符进行编码工作报告') 无效的拉丁语-1。如果要以utf-8编码发送,请使用body.encode('utf-8')。
正如HTTP POST的默认编码所述,它是ISO-8859-1又名Latin-1。正如回溯末尾的错误消息所告诉您的,您可以通过将其编码为UTF-8
bytes
string来强制它;但当然,您的服务器也需要使用UTF-8;否则,您只需要发送无用的Latin-1 mojibake

POST接口本身无法强制执行此操作,但您的服务器实际上可能会要求客户端使用
charset
参数显式指定其内容编码;如果缺少特定的5xx错误代码,可能会返回带有显式错误消息的特定5xx错误代码

稍微不那么严格,您可以让服务器尝试将传入的POST请求解码为UTF-8,如果解码失败,则拒绝POST。

请求*标准库发送请求。此方法将
str
数据编码为拉丁语-1,但不会对
字节进行编码

如果提供编码输入,则应添加指定所用编码的内容类型标头;相反,如果提供内容类型标头,则应确保正文的编码与指定的编码匹配

从http://code>HTTPConnection.request的文档中:

如果指定了body,则在完成标头后发送指定的数据。它可以是str、类似字节的对象、打开的文件对象或字节的iterable。如果body是字符串,则将其编码为ISO-8859-1,这是HTTP的默认值。如果是类似字节的对象,则按原样发送字节。如果是文件对象,则文件内容为sent;此文件对象应至少支持read()方法。如果文件对象是io.TextIOBase的实例,则read()方法返回的数据将被编码为ISO-8859-1,否则read()返回的数据将按原样发送。如果正文是iterable,则iterable的元素将按原样发送,直到iterable用尽为止

*根据最新的JSON规范(),httplib在Python3中重命名为http.client。使用外部服务时,您必须将JSON有效负载编码为UTF-8。下面是一个快速解决方案:

r = requests.post("http://httpbin.org/post", data=payload.encode('utf-8'))
请求
使用
httplib
,默认为
latin-1
编码。字节数组不会自动编码,因此最好使用它们

我还建议使用
headers
参数设置字符集:

r = requests.post("http://httpbin.org/post", data=payload.encode('utf-8'),
                  headers={'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'})

运行时是否收到错误消息?我收到了有关使用
Latin-1
编码的错误消息。但我手动编码时没有问题
payload=“text”。encode('utf-8')
数据
应该是“字典、元组列表、字节或类似文件的对象”.Strings不是一个有文档记录的选项。也就是说,代码似乎接受Unicode字符串,我还没有跟踪到应用了什么类型的编码,或者如果传入Unicode字符串,编码发生在哪里。它似乎一直未编码到传递到
urlib3
,我不确定
urlib3
不处理数据。可能存在重复的