You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter调用Laravel接口下载Excel遇405错误求助

问题:Flutter通过Dio下载Laravel后端Excel时出现405错误

错误信息

[ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: DioError [DioErrorType.response]: Http status error [405]
E/flutter (24963): Source stack:

相关代码

Flutter代码

void downloaddd() async {
    String name = "Excel-of-salaries";
    String path = await _getFilePath(name);
    String url =
        "http://10.0.2.2:8000/xxxxxxxxxxxxxx/${widget.masterID}";
    var data = await dio.download(url, path, data: {
      "id": 1,
    });
    print(data);
}

Laravel控制器代码

class SalaryExportsController extends Controller
{
    public function export(Request $request, $id)
    {
        return Excel::download(new SalaryExports($request, $id), 'users.xlsx');
    }
}

Laravel路由(api.php)

Route::post('/xxxxxxxxxx/{id}', [SalaryExportsController::class, 'export']);

原因分析

405错误表示HTTP请求方法不被服务器允许,核心矛盾:

  • Dio的download()方法默认使用GET请求发送请求
  • 后端Laravel路由定义的是POST请求
    两者请求方法不匹配,因此服务器返回405错误。

解决方法

方案1:修改Flutter代码,使用POST请求下载

在dio.download()中显式指定请求方法为POST,确保和后端路由一致:

void downloaddd() async {
    String name = "Excel-of-salaries";
    String path = await _getFilePath(name);
    String url = "http://10.0.2.2:8000/xxxxxxxxxxxxxx/${widget.masterID}";
    var data = await dio.download(
      url, 
      path, 
      data: {"id": 1},
      options: Options(method: 'POST'), // 指定POST请求方法
    );
    print(data);
}

方案2:修改Laravel后端,改用GET路由

如果不需要通过请求体传递参数(路由已包含$id,额外参数可通过URL查询字符串传递),可以将路由改为GET:
修改api.php:

Route::get('/xxxxxxxxxx/{id}', [SalaryExportsController::class, 'export']);

若需传递id=1这类参数,可在Flutter中拼接URL:

String url = "http://10.0.2.2:8000/xxxxxxxxxxxxxx/${widget.masterID}?id=1";

控制器中通过$request->query('id')获取该参数即可。


内容的提问来源于stack exchange,提问作者swapnil mane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:45:39