Flutter调用ASP.NET Core API返回404错误,求解决方案
问题排查与解决方案
针对你遇到的Flutter调用ASP.NET Core API返回404的问题,结合Postman请求正常的情况,按以下步骤逐一排查:
1. 核对请求URL的一致性
- 逐字符对比Flutter代码中的请求URL与Postman中的完整URL:
- 确认协议(
http/https)完全一致,比如Postman用http://localhost:5000,Flutter不要误写成https; - 端口号必须匹配,ASP.NET Core开发服务器默认端口是5000(HTTP)或5001(HTTPS),检查Flutter代码里的端口是否正确;
- 路由路径要完全对应,比如API的注册接口路由是
api/Account/Register,Flutter里不能遗漏api前缀; - 注意大小写(虽然ASP.NET Core默认路由不区分大小写,但部分自定义路由配置可能敏感)。
- 确认协议(
2. 验证请求方法与参数格式
- 确认Flutter使用的请求方法和Postman一致:Postman用
POST,Flutter不能写成GET; - 检查请求体与请求头:
- Postman如果是JSON格式提交参数,Flutter必须设置
Content-Type: application/json请求头,并且将参数序列化为JSON字符串:final response = await http.post( Uri.parse('http://你的API地址/api/Account/Register'), headers: {'Content-Type': 'application/json'}, body: jsonEncode({ 'username': 'test', 'password': '123456' }), ); - 避免混用FormData格式(除非API明确要求),Postman里如果选了
raw-JSON,Flutter就要对应使用JSON序列化的body。
- Postman如果是JSON格式提交参数,Flutter必须设置
3. 检查设备网络访问规则
- Android模拟器:访问本地API必须用
10.0.2.2代替localhost,因为模拟器的localhost指向自身而非宿主电脑; - iOS模拟器:可以直接用
localhost或127.0.0.1,但要确保宿主电脑的防火墙允许API端口的访问; - 物理设备:需确保设备与API所在电脑在同一局域网,使用宿主电脑的局域网IP(如
192.168.1.100)访问,不能用localhost。
4. 确认API的跨域(CORS)配置
虽然404是路由问题,但错误的CORS配置可能导致请求被拦截后返回异常状态码。检查ASP.NET Core的CORS配置:
在Program.cs中确保已添加并启用CORS策略:
// 注册CORS服务 builder.Services.AddCors(options => { options.AddPolicy("AllowLocalFlutter", policy => { policy.WithOrigins("http://localhost:5000", "http://10.0.2.2:5000") // 对应Flutter运行的地址 .AllowAnyMethod() .AllowAnyHeader(); }); }); // 在路由之后启用CORS app.UseRouting(); app.UseCors("AllowLocalFlutter"); // 必须放在UseRouting之后,UseAuthorization之前 app.UseAuthorization();
开发环境可以临时用AllowAnyOrigin()简化配置,生产环境需指定具体允许的域名。
5. 启用API日志定位请求
在ASP.NET Core中启用路由调试日志,确认请求是否真的到达服务器:
修改appsettings.Development.json:
"Logging": { "LogLevel": { "Microsoft.AspNetCore.Routing": "Debug", "Microsoft.AspNetCore.Hosting": "Debug" } }
运行API后查看控制台日志:
- 如果日志中没有接收到Flutter的请求,说明是Flutter端的网络请求未发送成功;
- 如果有请求记录但返回404,说明路由不匹配,检查API的控制器路由配置(比如
[Route("api/[controller]")]是否正确)。
6. 对比请求详情
用Flutter的日志工具打印完整请求信息,和Postman的请求详情逐行对比:
import 'dart:developer'; // 在请求前后打印日志 log('请求URL: ${requestUri.toString()}'); log('请求方法: POST'); log('请求头: ${headers.toString()}'); log('请求体: ${body.toString()}'); final response = await http.post(...); log('响应状态码: ${response.statusCode}'); log('响应内容: ${response.body}');
对比Postman的“Headers”和“Body”标签页,找出两者的差异点。
内容的提问来源于stack exchange,提问作者link
相关产品推荐
相关产品推荐

