Flutter/Dart中如何使用POST请求响应头发起新GET请求
核心逻辑分两步:先从登录返回的响应头/响应体里提取有效认证凭证,再把凭证按接口要求塞到后续GET请求的对应位置即可,以下是通用实现逻辑,适配绝大多数站点认证逻辑:
1. 提取认证凭证
根据站点认证方式不同,凭证一般存放在两个位置:
存放在响应头
Set-Cookie字段
传统服务端渲染站点大多用Session+Cookie做会话保持,登录成功后服务端会通过Set-Cookie响应头返回会话标识(常见字段名是SESSIONID、JSESSIONID等)。
如果你用的是支持会话自动维护的请求库(比如Python的requests、Java的OkHttp带CookieJar、JS的axios带withCredentials配置),只需要在整个请求流程复用同一个会话/客户端实例,库会自动解析存储Set-Cookie的内容,后续请求自动携带,不需要手动提取。
如果你需要手动处理,直接读取响应头的Set-Cookie字段值,后续请求放到Cookie请求头中即可。
参考POST登录示例代码:import requests # 初始化全局会话对象,自动维护全流程Cookie session = requests.Session() login_api = "https://your-domain.com/api/login" login_params = {"account": "test", "password": "test123"} # 发送POST登录请求 login_resp = session.post(login_api, json=login_params) # 手动提取Cookie的写法(用自动会话维护不需要这步) # cookie_str = login_resp.headers.get("Set-Cookie")存放在响应体中
前后端分离项目大多用Token做认证,登录成功后会在响应体返回access_token、token这类字段,典型响应体结构示例:{ "code": 0, "message": "登录成功", "data": { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxxx", "expire": 7200 } }这类场景你需要先解析响应体,取出对应的token值,后续请求按接口要求放到请求头里,90%以上的接口会要求放到
Authorization头,格式为Bearer 取出的token值,少数接口会要求放到自定义请求头、URL查询参数里,按对应接口规则拼接即可。
参考提取代码:# 解析响应体提取token login_result = login_resp.json() token = login_result["data"]["access_token"] # 构造GET请求头 get_headers = { "Authorization": f"Bearer {token}", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" }
2. 发起目标页面GET请求
对应上面两种认证场景,发起请求的逻辑如下:
- Cookie会话场景:直接复用之前的会话对象发GET即可,Cookie会自动携带
target_page_url = "https://your-domain.com/user/home" get_resp = session.get(target_page_url) print("页面返回内容:", get_resp.text) - Token认证场景:把构造好的带认证信息的请求头传入GET请求即可
target_page_url = "https://your-domain.com/user/home" get_resp = requests.get(target_page_url, headers=get_headers) print("页面返回内容:", get_resp.text)
常见踩坑提示:
- 不要每次发请求都新建客户端/会话实例,会导致存储的Cookie、临时认证信息丢失,触发认证失败
- 手动拼接Cookie时不要丢弃
Set-Cookie返回的Path、HttpOnly等属性字段,部分服务端会校验这些字段合法性- 提取Token时注意响应体字段层级,不要写错键名;部分接口不需要手动加
Bearer前缀,按接口文档要求拼接即可
内容的提问来源于stack exchange,提问作者JoshuaaMarkk

