Flutter中Dio Post请求返回404错误求助
以下是针对你遇到的问题的具体排查方向:
路径大小写不匹配
你通过枚举_DioServicePaths.sessioninfo.name生成的请求路径是小写的sessioninfo,但服务器路由可能区分大小写(比如Postman中使用的是SessionInfo或sessionInfo),导致路径无法匹配。
解决:手动指定和Postman一致的路径字符串,替换_DioServicePaths.sessioninfo.name为正确的路径,比如'SessionInfo'。BaseURL格式错误
当前BaseURL中的IP部分多了一个末尾的点:http://xx.xx.x.xx.:xx/,这会导致拼接后的请求URL无效。
解决:修正BaseURL为http://xx.xx.x.xx:xx/(去掉IP后的多余点)。请求头缺失或不一致
Postman可能自动添加了服务器要求的请求头(比如Content-Type: application/json),而Dio默认配置可能未包含这些头,导致服务器无法识别请求。
解决:在Dio的BaseOptions中显式设置请求头:DioService() : _dio = Dio(BaseOptions( baseUrl: 'http://xx.xx.x.xx:xx/', headers: {'Content-Type': 'application/json'}, ));同时对比Postman的请求头,确保所有必要字段都一致。
请求体格式差异
虽然toJson()方法生成了对应键值,但可能存在空值、日期格式不匹配等问题。可以打印实际发送的请求体,和Postman中的内容对比。
解决:在请求前添加日志打印:print('发送的请求体:${jsonEncode(info.toJson())}'); final response = await _dio.post(...);核对键名、值的类型和格式是否与Postman完全一致。
查看完整请求详情
通过Dio日志拦截器查看完整的请求URL、头、体,确认和Postman的请求是否完全一致。
解决:添加日志拦截器:DioService() { _dio = Dio(BaseOptions(baseUrl: 'http://xx.xx.x.xx:xx/')); _dio.interceptors.add(LogInterceptor(requestBody: true, responseBody: true)); }运行后查看控制台输出,对比Postman的请求细节,定位差异点。
内容的提问来源于stack exchange,提问作者ahmetkrakaya

