Flutter中使用Dio发送带JSON与图片的请求报500错误求助
在Flutter中用Dio发送与Postman一致的FormData请求问题
该请求在Postman中可正常运行(请求包含嵌套的mobileRequest参数以及多个files文件),但我用Dio尝试以下两种方式时,均返回500内部服务器错误:
方式一
formData = FormData.fromMap({ "mobileRequest": { "companyRequest": { "companyId": 1, "serviceName": "service1", "serviceDescription": "service1", "serviceContactInfo": "+201001656577,+20100987654", "serviceCategoryId": 1 } }, }); for (var file in filePathes) { formData.files.addAll([ MapEntry( "files", await MultipartFile.fromFile( file, filename: file.split('/').last, ), ), ]); }
方式二
List<MultipartFile> filesList2 = serviceEntiti.images! .map((e) => MultipartFile.fromFileSync(e.path)) .toList(); formData = FormData.fromMap({ "mobileRequest": { "companyRequest": { "companyId": 1, "serviceName": "service1", "serviceDescription": "service1", "serviceContactInfo": "+201001656577,+20100987654", "serviceCategoryId": 1 } }, "files": filesList2, });
解决方法
问题出在Dio对嵌套Map的处理逻辑上:Dio会自动将FormData中的嵌套Map展开为mobileRequest[companyRequest][companyId]这类分散的表单字段,但后端大概率期望mobileRequest是一个完整的JSON字符串。正确的做法是先将嵌套对象序列化为JSON字符串,再放入FormData中:
import 'dart:convert'; import 'package:dio/dio.dart'; // 1. 将嵌套的请求参数转为JSON字符串 String mobileRequestJson = jsonEncode({ "companyRequest": { "companyId": 1, "serviceName": "service1", "serviceDescription": "service1", "serviceContactInfo": "+201001656577,+20100987654", "serviceCategoryId": 1 } }); // 2. 构建FormData FormData formData = FormData.fromMap({ "mobileRequest": mobileRequestJson, }); // 3. 添加文件(如果需要指定文件MIME类型,可添加contentType参数) for (var file in filePathes) { formData.files.add(MapEntry( "files", await MultipartFile.fromFile( file, filename: file.split('/').last, contentType: MediaType('image', 'jpeg'), // 根据实际文件类型调整,比如png、pdf等 ), )); } // 4. 发送POST请求 Response response = await Dio().post( "你的接口地址", data: formData, );
另外,也可以检查文件的读取方式:如果使用fromFileSync要确保文件路径正确,避免因文件读取失败导致请求异常。
内容的提问来源于stack exchange,提问作者ialyzaafan
相关产品推荐
相关产品推荐

