Jcy*_*rss 5 python python-requests
使用以下代码
payload = '''
????
???????
'''
r = requests.post("http://httpbin.org/post", data=payload)
Run Code Online (Sandbox Code Playgroud)
请求发布数据为字符串类型时的默认编码是什么?UTF8 还是 unicode 转义?
如果我想指定编码类型,是否必须自己编码并将字节对象传递给参数“数据”?
nev*_*ves 10
根据最新的 JSON 规范 ( RFC-8259 ),在使用外部服务时,您必须将 JSON 有效负载编码为 UTF-8。这是一个快速解决方案:
r = requests.post("http://httpbin.org/post", data=payload.encode('utf-8'))
Run Code Online (Sandbox Code Playgroud)
requests使用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'})
Run Code Online (Sandbox Code Playgroud)
如果您实际尝试您的示例,您会发现:
\n\n$ python\nPython 3.7.2 (default, Jan 29 2019, 13:41:02) \n[Clang 10.0.0 (clang-1000.10.44.4)] on darwin\nType "help", "copyright", "credits" or "license" for more information.\n>>> import requests\n>>> payload = \'\'\'\n... \xe5\xb7\xa5\xe4\xbd\x9c\xe6\x8a\xa5\xe5\x91\x8a \n... \xe6\x80\xbb\xe4\xbd\x93\xe6\x83\x85\xe5\x86\xb5\xef\xbc\x9a\xe8\x89\xaf\xe5\xa5\xbd \n... \'\'\'\n>>> r = requests.post("http://127.0.0.1:8888/post", data=payload)\nTraceback (most recent call last):\n File "<stdin>", line 1, in <module>\n File "/tmp/venv/lib/python3.7/site-packages/requests/api.py", line 116, in post\n return request(\'post\', url, data=data, json=json, **kwargs)\n File "/tmp/venv/lib/python3.7/site-packages/requests/api.py", line 60, in request\n return session.request(method=method, url=url, **kwargs)\n File "/tmp/venv/lib/python3.7/site-packages/requests/sessions.py", line 533, in request\n resp = self.send(prep, **send_kwargs)\n File "/tmp/venv/lib/python3.7/site-packages/requests/sessions.py", line 646, in send\n r = adapter.send(request, **kwargs)\n File "/tmp/venv/lib/python3.7/site-packages/requests/adapters.py", line 449, in send\n timeout=timeout\n File "/tmp/venv/lib/python3.7/site-packages/urllib3/connectionpool.py", line 600, in urlopen\n chunked=chunked)\n File "/tmp/venv/lib/python3.7/site-packages/urllib3/connectionpool.py", line 354, in _make_request\n conn.request(method, url, **httplib_request_kw)\n File "/tmp/venv/lib/python3.7/http/client.py", line 1229, in request\n self._send_request(method, url, body, headers, encode_chunked)\n File "/tmp/venv/lib/python3.7/http/client.py", line 1274, in _send_request\n body = _encode(body, \'body\')\n File "/tmp/venv/lib/python3.7/http/client.py", line 160, in _encode\n (name.title(), data[err.start:err.end], name)) from None\nUnicodeEncodeError: \'latin-1\' codec can\'t encode characters in position 2-5: Body (\'\xe5\xb7\xa5\xe4\xbd\x9c\xe6\x8a\xa5\xe5\x91\x8a\') is not valid Latin-1. Use body.encode(\'utf-8\') if you want to send it encoded in UTF-8.\nRun Code Online (Sandbox Code Playgroud)\n\n如检测 HTTP POST 请求的字符编码中所述,HTTP POST 的默认编码是 ISO-8859-1 又名 Latin-1。正如回溯末尾的错误消息告诉您的那样,您可以通过编码为 UTF-8bytes字符串来强制执行;当然,你的服务器也需要支持 UTF-8;否则您将只是发送无用的 Latin-1 mojibake。
POST 接口本身无法强制执行此操作,但服务器实际上可能要求客户端使用参数显式指定其内容编码charset;如果丢失,可能会返回特定的 5xx 错误代码以及明确的错误消息。
不太严格的做法是,您可以让服务器尝试将传入的 POST 请求解码为 UTF-8,如果失败则拒绝 POST。
\n| 归档时间: |
|
| 查看次数: |
8764 次 |
| 最近记录: |