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
相关产品推荐
相关产品推荐

