Flutter Dio请求出现403错误,请求排查登录接口问题
收到的错误提示
[ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception:
DioError [DioErrorType.response]: Http status error [403]
调用接口的代码
Future<LoginModel?> loginCall( String email, String password, ) async { Map<String, dynamic> json = {"email": email, "hashPass": password}; var response = await dio.post(baseUrl + "login", data: json); print(response.data); print(response.statusCode); if (response.statusCode == 200) { var result = LoginModel.fromJson(response.data); print("gelen response: ${response.data}"); return result; } else { throw Exception("Error! ${response.statusCode}"); } }
可能的原因及解决办法
请求头缺失必要参数
多数后端接口会要求携带特定请求头,比如Content-Type、自定义签名头或版本标识头。当前代码未设置任何请求头,若后端要求这类参数,就会返回403。
解决:添加对应请求头,示例:var response = await dio.post( baseUrl + "login", data: json, options: Options( headers: { "Content-Type": "application/json", // 按需补充后端要求的其他头,如设备ID、签名等 // "X-Device-ID": "your_device_id", }, ), );参数字段名或格式不符
代码中密码字段用的是hashPass,但后端可能要求password或其他字段名;或者密码需要先做哈希处理(如MD5、SHA256),直接传明文会导致验证失败返回403。
解决:核对后端接口文档的字段名,确认密码是否需要哈希后再传递。IP/域名被后端拦截
后端可能设置了IP白名单,测试设备IP不在允许范围内;或者Web端Flutter的域名未加入后端跨域允许列表,导致请求被拦截。
解决:联系后端管理员将测试IP/域名加入白名单;跨域问题需后端配置CORS允许对应源访问。账号或验证逻辑问题
账号可能被封禁、权限不足,或者后端要求验证码、设备绑定等额外验证参数,而你的请求未携带这些内容。
解决:检查账号状态是否正常,确认接口是否需要验证码、设备ID等参数,补充后重新请求。Dio证书或代理配置问题
如果后端用自签HTTPS证书,Dio默认会拒绝信任;或者代理设置错误导致请求被拦截。
解决:测试环境可临时信任自签证书(生产环境不建议):dio.httpClientAdapter = HttpClientAdapter()..onHttpClientCreate = (client) { client.badCertificateCallback = (cert, host, port) => true; return client; };生产环境需导入正确的证书文件。
内容的提问来源于stack exchange,提问作者Mert

