Python代码示例:发送post请求传递json参数及接收文件流返回值

发送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数据先编码为字节串,因为Requestdata参数需要字节类型。

处理文件流返回值

当接口返回的是文件流时,无论是使用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为你实际的文件下载地址,并根据实际情况调整文件名和路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学亮编程手记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值