发送post请求传递json参数
无论是使用requests
库还是Python标准库urllib.request
来发送POST请求,携带JSON参数的方法稍有不同。下面是两种情况的示例:
使用requests
库
import requests
import json
url = 'https://httpbin.org/post'
data = {'key1': 'value1', 'key2': 'value2'}
# 将字典转换为JSON字符串
json_data = json.dumps(data)
# 设置请求头,告知服务器发送的是JSON格式的数据
headers = {'Content-Type': 'application/json'}
response = requests.post(url, data=json_data, headers=headers)
print(response.text)
使用Python标准库urllib.request
import json
from urllib import request, error, parse
url = 'https://httpbin.org/post'
data = {'key1': 'value1', 'key2': 'value2'}
# 将字典转换为JSON字符串
json_data = json.dumps(data).encode('utf-8')
# 构造一个Request对象,指定headers表明发送的是JSON格式的数据
req = request.Request(url, data=json_data, headers={'Content-Type': 'application/json'}, method='POST')
try:
# 发送请求并获取响应
with request.urlopen(req) as response:
the_page = response.read().decode('utf-8')
print(the_page)
except error.URLError as e:
print(f'发生错误: {e}')
在这两个示例中,我们都首先将数据字典转换为JSON字符串,然后在发送请求时通过设置Content-Type
头部为application/json
来告诉服务器数据是以JSON格式传输的。对于requests
库,可以直接将JSON字符串作为data
参数传入;而对于标准库urllib.request
,需要将JSON数据先编码为字节串,因为Request
的data
参数需要字节类型。
处理文件流返回值
当接口返回的是文件流时,无论是使用requests
还是Python标准库urllib.request
,都可以接收到文件流并将其保存到本地。以下是两种方式的示例:
使用requests
库
import requests
url = 'https://example.com/file/download' # 假设的文件下载URL
response = requests.get(url, stream=True)
# 确保请求成功
if response.status_code == 200:
with open('downloaded_file.txt', 'wb') as f:
for chunk in response.iter_content(chunk_size=1024):
if chunk: # 过滤掉keep-alive新行
f.write(chunk)
print("文件下载完成。")
else:
print(f"下载失败,状态码:{response.status_code}")
使用Python标准库urllib.request
from urllib import request
url = 'https://example.com/file/download' # 假设的文件下载URL
# 请求上下文管理器
with request.urlopen(url) as response:
# 打开本地文件用于写入
with open('downloaded_file.txt', 'wb') as out_file:
# 读取响应内容并写入文件
while True:
chunk = response.read(1024)
if not chunk:
break
out_file.write(chunk)
print("文件下载完成。")
在这两个示例中,我们都设置了请求为流模式(stream=True
对于requests
,而urlopen
直接支持流式读取),这样可以边下载边写入文件,特别适合处理大文件,避免一次性加载整个文件到内存中。然后,我们逐块读取响应内容并写入到本地文件中,直到没有更多内容可读。请确保替换示例中的URL为你实际的文件下载地址,并根据实际情况调整文件名和路径。