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请求并处理问题求教


9 回复

就是 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()

核心要点:

  1. 使用requests.post()发送POST请求
  2. 通过data参数发送表单数据,json参数发送JSON数据
  3. 使用files参数上传文件
  4. 通过headers参数设置请求头
  5. 使用timeout参数设置超时时间
  6. try-except处理请求异常
  7. 通过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

回到顶部