post请求
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了post请求相关的知识,希望对你有一定的参考价值。
POST 请求
通常,你想要发送一些编码为表单形式的数据——非常像一个 html 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:
>>> payload = {‘key1‘: ‘value1‘, ‘key2‘: ‘value2‘} >>> r = requests.post("http://python123.io/ws/demo.html", data=payload) >>> print(r.text) { ... "form": { "key2": "value2", "key1": "value1" }, ... }
你还可以为 data
参数传入一个元组列表。在表单中多个元素使用同一 key 的时候,这种方式尤其有效:
>>> payload = ((‘key1‘, ‘value1‘), (‘key1‘, ‘value2‘)) >>> r = requests.post(‘http://python123.io/ws/demo.html‘, data=payload) >>> print(r.text) { ... "form": { "key1": [ "value1", "value2" ] }, ... }
很多时候你想要发送的数据并非编码为表单形式的。如果你传递一个 string
而不是一个 dict
,那么数据会被直接发布出去。
例如,Github API v3 接受编码为 JSON 的 POST/PATCH 数据:
>>> import json >>> url = ‘https://api.github.com/some/endpoint‘ >>> payload = {‘some‘: ‘data‘} >>> r = requests.post(url, data=json.dumps(payload))
此处除了可以自行对 dict
进行编码,你还可以使用 json
参数直接传递,然后它就会被自动编码。这是 2.4.2 版的新加功能:
>>> url = ‘https://api.github.com/some/endpoint‘ >>> payload = {‘some‘: ‘data‘} >>> r = requests.post(url, json=payload)
POST一个多部分编码(Multipart-Encoded)的文件
Requests 使得上传多部分编码文件变得很简单:
>>> url = ‘http://httpbin.org/post‘ >>> files = {‘file‘: open(‘report.xls‘, ‘rb‘)} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "<censored...binary...data>" }, ... }
你可以显式地设置文件名,文件类型和请求头:
>>> url = ‘http://httpbin.org/post‘ >>> files = {‘file‘: (‘report.xls‘, open(‘report.xls‘, ‘rb‘), ‘application/vnd.ms-excel‘, {‘Expires‘: ‘0‘})} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "<censored...binary...data>" }, ... }
如果你想,你也可以发送作为文件来接收的字符串:
>>> url = ‘http://httpbin.org/post‘ >>> files = {‘file‘: (‘report.csv‘, ‘some,data,to,send\nanother,row,to,send\n‘)} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "some,data,to,send\\nanother,row,to,send\\n" }, ... }
如果你发送一个非常大的文件作为 multipart/form-data
请求,你可能希望将请求做成数据流。默认下 requests
不支持, 但有个第三方包 requests-toolbelt
是支持的。你可以阅读 toolbelt 文档来了解使用方法。
在一个请求中发送多文件参考 高级用法 一节。
警告
我们强烈建议你用二进制模式(binary mode)打开文件。这是因为 Requests 可能会试图为你提供 Content-Length
header,在它这样做的时候,这个值会被设为文件的字节数(bytes)。如果用文本模式(text mode)打开文件,就可能会发生错误。
以上是关于post请求的主要内容,如果未能解决你的问题,请参考以下文章
求教golang中http发送post请求gb2312编码的解决方案
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装