Python中如何实现post请求并处理问题求教
用 Fiddler 抓的 post 包中有如下数据,这种数据该怎么用 post 提交?也就是 urllib.request.Request(url, data,header)的 data 该怎么构造?求大佬解答~
***从以下开始
-----------------------------7e11614f10de
Content-Disposition: form-data; name=“token”
f91aa2948c4ab9bf80b17f9c6a3984ef
-----------------------------7e11614f10de
Content-Disposition: form-data; name=“cbi.submit”
1
-----------------------------7e11614f10de
Content-Disposition: form-data; name=“tab.network.TEST”
advanced
-----------------------------7e11614f10de
Content-Disposition: form-data; name=“cbid.network.TEST._fwzone”
-
-----------------------------7e11614f10de
Content-Disposition: form-data; name=“cbid.network.TEST._fwzone.newzone”
-----------------------------7e11614f10de
Content-Disposition: form-data; name=“cbi.cbe.network.TEST.type”
1
-----------------------------7e11614f10de
Content-Disposition: form-data; name=“cbi.cbe.network.TEST.ifname_single”
1
-----------------------------7e11614f10de
Content-Disposition: form-data; name=“cbid.network.TEST.ifname_single”
eth0.3
-----------------------------7e11614f10de
Content-Disposition: form-data; name=“cbid.network.TEST.proto”
dhcp
***********结束 省略部分数据,格式一样
Python中如何实现post请求并处理问题求教
就是 multipart 而已,最简单的方式就是照抄…
记得标记一下 7e11614f10de 这个字符串是 multipart 分隔符
import requests
import json
# 基础POST请求示例
def basic_post_request():
url = "https://httpbin.org/post"
data = {"key1": "value1", "key2": "value2"}
# 发送POST请求
response = requests.post(url, data=data)
# 检查响应状态
if response.status_code == 200:
print("请求成功!")
print("响应内容:", response.text)
else:
print(f"请求失败,状态码: {response.status_code}")
# 处理JSON数据的POST请求
def post_with_json():
url = "https://httpbin.org/post"
json_data = {"name": "张三", "age": 25, "city": "北京"}
# 发送JSON数据
response = requests.post(url, json=json_data)
if response.ok:
result = response.json()
print("JSON响应:", json.dumps(result, indent=2, ensure_ascii=False))
# 处理文件上传
def post_with_file():
url = "https://httpbin.org/post"
# 准备文件
files = {'file': open('example.txt', 'rb')} # 确保文件存在
response = requests.post(url, files=files)
if response.status_code == 200:
print("文件上传成功")
print(response.json())
# 处理请求头
def post_with_headers():
url = "https://httpbin.org/post"
headers = {
'User-Agent': 'MyApp/1.0',
'Authorization': 'Bearer your_token_here',
'Content-Type': 'application/json'
}
data = {"test": "data"}
response = requests.post(url, headers=headers, json=data)
if response.ok:
print("带请求头的POST请求成功")
# 处理超时和错误
def post_with_error_handling():
url = "https://httpbin.org/post"
data = {"key": "value"}
try:
# 设置超时时间(秒)
response = requests.post(url, data=data, timeout=5)
response.raise_for_status() # 如果状态码不是200,抛出异常
print("请求成功:", response.json())
except requests.exceptions.Timeout:
print("请求超时")
except requests.exceptions.HTTPError as err:
print(f"HTTP错误: {err}")
except requests.exceptions.RequestException as err:
print(f"请求异常: {err}")
# 处理响应数据
def handle_response():
url = "https://httpbin.org/post"
data = {"query": "python"}
response = requests.post(url, data=data)
# 获取不同格式的响应数据
text_content = response.text # 文本格式
json_content = response.json() # JSON格式(自动解析)
headers = response.headers # 响应头
status = response.status_code # 状态码
print(f"状态码: {status}")
print(f"响应头: {headers}")
print(f"JSON响应: {json_content}")
# 主函数
if __name__ == "__main__":
print("=== 基础POST请求 ===")
basic_post_request()
print("\n=== 发送JSON数据 ===")
post_with_json()
print("\n=== 错误处理示例 ===")
post_with_error_handling()
print("\n=== 处理响应数据 ===")
handle_response()
核心要点:
- 使用
requests.post()发送POST请求 - 通过
data参数发送表单数据,json参数发送JSON数据 - 使用
files参数上传文件 - 通过
headers参数设置请求头 - 使用
timeout参数设置超时时间 - 用
try-except处理请求异常 - 通过
response.json()解析JSON响应
建议: 用requests库处理POST请求,注意区分data和json参数的使用场景。
直接用 request_toolkit 这个库 好像是这个名字 你去搜搜
啊?我今天还用的 urllib,踩了好多个坑,难道跟库有关系?
同#3,完全不懂的新手还是老老实实用 requests 吧,用 urllib 真的要命
上传文件,就自动转这种
用 requests
form data append 前端这么做的,python 应该也有 form data 的生成库吧
感谢各位大佬的指点,问题解决了,附上我的代码:
def modTEST():
url = ‘http://192.168.1.1/cgi-bin/luci/admin/network/network/TEST’
data = {‘token’:(None,getToken()),
‘cbi.submit’:(None,‘1’),
‘tab.network.TEST’:(None,‘advanced’),
‘cbid.network.TEST._fwzone’:(None,’-’),
‘cbid.network.TEST._fwzone.newzone’:(None,’’),
‘cbi.cbe.network.TEST.type’:(None,‘1’),
‘cbi.cbe.network.TEST.ifname_single’:(None,‘1’),
‘cbid.network.TEST.ifname_single’:(None,‘eth0.3’),
‘cbid.network.TEST.proto’:(None,‘dhcp’),
‘cbid.network.TEST.hostname’:(None,’’),
‘cbi.cbe.network.TEST.auto’:(None,‘1’),
‘cbi.cbe.network.TEST.delegate’:(None,‘1’),
‘cbid.network.TEST.delegate’:(None,‘1’),
‘cbi.cbe.network.TEST.broadcast’:(None,‘1’),
‘cbi.cbe.network.TEST.defaultroute’:(None,‘1’),
‘cbid.network.TEST.defaultroute’:(None,‘1’),
‘cbi.cbe.network.TEST.peerdns’:(None,‘1’),
‘cbid.network.TEST.peerdns’:(None,‘1’),
‘cbid.network.TEST.metric’:(None,’’),
‘cbid.network.TEST.clientid’:(None,’’),
‘cbid.network.TEST.vendorid’:(None,’’),
‘cbid.network.TEST.macaddr’:(None,‘00:e0:4c:36:11:a1’),
‘cbid.network.TEST.mtu’:(None,’’),
‘cbi.apply’:(None,‘保存&应用’)}
print(data)
res = requests.post(url, files=data, cookies={‘sysauth’: cookiesValue})
print(res.request.body)
print(res.request.headers)
res.encoding = ‘utf8’
print(res.text)
restartFireWall()
return

