Python与Flutter HTTP请求差异:Flutter请求返回404问题排查
问题分析与解决方案
出现这个差异的核心原因是Flutter Web 环境下的 HTTP 请求与 Python requests 请求在实际发送的内容上存在细微差别,服务器对这些差别做了拦截处理,以下是具体排查方向和解决方法:
1. 修正请求头的大小写格式
HTTP 标准中请求头字段名采用驼峰式(首字母大写),虽然大部分服务器兼容小写,但 Naver 的服务器可能对字段名格式有严格校验。将你的请求头字段名改为标准格式:
var headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', 'Referer': 'https://datalab.naver.com/shoppingInsight/sCategory.naver' };
2. 避免 URL 编码差异
直接使用 Uri.parse 可能存在隐性编码问题,改用 Uri.https 构建 URL,确保参数编码完全符合标准:
import 'package:http/http.dart' as http; // 用键值对构建查询参数,自动处理编码 var uri = Uri.https( 'datalab.naver.com', '/shoppingInsight/getCategoryKeywordRank.naver', { 'cid': '50000000', 'timeUnit': 'date', 'startDate': '2023-02-21', 'endDate': '2023-03-21', 'device': '', 'page': '1', 'count': '20' }, ); var response = await http.get(uri, headers: headers); print(response.body);
3. 补充 Origin 请求头
Flutter Web 运行在浏览器中,浏览器会自动添加 Origin 头,而 Python requests 默认不会发送这个头。服务器可能会校验 Origin 是否合法,手动添加该头匹配请求来源:
var headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', 'Referer': 'https://datalab.naver.com/shoppingInsight/sCategory.naver', 'Origin': 'https://datalab.naver.com' // 补充Origin头 };
4. 对比实际请求内容
如果以上方法无效,建议直接查看两种请求的实际发送内容:
- Flutter Web:打开浏览器开发者工具(F12)→ Network 标签,找到对应请求,查看 Request Headers 和 Request URL
- Python:添加
requests的调试日志,查看实际发送的头和 URL:import requests import logging # 开启调试日志 logging.basicConfig(level=logging.DEBUG) response = requests.get(url, headers=headers)
对比两者的差异,就能定位服务器拦截的具体原因。
内容的提问来源于stack exchange,提问作者Shin euichul
相关产品推荐
相关产品推荐

