Flutter向.NET Core API发送评论报DioError 400错误如何解决
问题背景
- 后端基于.NET Core API搭建,Web端评论提交功能运行正常
- Flutter移动端提交关联指定文档的评论时,抛出Dio 400响应错误:
[ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: DioError [DioErrorType.response]: Http status error [400] - 移动端提交的请求对象结构与Web端完全一致,示例结构如下:
其中{documentId: 45, parentId: null, text: "dsafd"}parentId字段用于关联父评论实现回复功能,发布顶级新评论时该字段取值为null。
关联代码
页面端评论发送触发方法
onCommentSend() async { Client _client = Client(); var data = { 'documentId': widget.dokumentId ?? 0, 'parentId': null, 'text': commentController.text, }; print(data); var res = await _dokumentiService!.addComment(data); print(res); if(data== true){ print('Added comment'); } else { print('not added'); } }
服务层请求封装方法
Future<bool> addComment(komentar) async { final response = await _client.post('/dokumenti/insertComment', data: komentar); if(response.statusCode == 200) { final jsonresponse = response.data; print(komentar); print(komentar); return jsonresponse; } else { throw Exception('failed'); print(Exception); } }
400错误排查与修复方案
这类同结构请求Web端正常、移动端返回400的问题,90%以上是请求头配置、序列化规则和Web端不一致导致的,按以下顺序排查即可:
- 先拿到完整的后端错误返回
不要只捕获400状态码,在Dio的异常捕获逻辑中打印DioError.response.data内容,.NET Core接口模型校验失败时,会在返回体中明确标注具体错误原因,比如字段缺失、类型不匹配、值不符合校验规则等,这一步能直接定位80%的问题。 - 检查请求Content-Type配置
Web端提交JSON请求时默认携带Content-Type: application/json请求头,Dio如果没有显式配置,POST请求默认会使用application/x-www-form-urlencoded格式发送载荷,而.NET Core标记了[FromBody]的接口只接收JSON格式载荷,收到表单格式请求会直接返回400。
修复方式:显式指定请求的Content-Type为JSON类型:final response = await _client.post( '/dokumenti/insertComment', data: komentar, options: Options(contentType: Headers.jsonContentType) ); - 检查null值序列化规则
如果Dio实例配置了deleteNullValue = true,值为null的parentId字段会被直接从请求体中移除,如果后端接口模型要求该字段必须存在(即使值为null),就会触发模型校验失败返回400。如果遇到这种情况,关闭序列化时删除null字段的配置即可。 - 核对字段类型与值合法性
打印Dio实际发出的请求原始载荷,确认:documentId是数字类型,而非字符串类型text字段不为空字符串(如果后端配置了评论内容必填校验)- 字段名大小写和后端模型匹配(部分严格配置的.NET Core接口会校验字段名大小写)
另外注意你现有代码里的两处逻辑问题:
- 页面方法中
if(data == true)的判断完全无效,data是你自己构造的请求Map对象,永远不会等于布尔值true,接口请求成功后应该判断返回的res值,而非原请求对象。 - 服务层方法中
throw Exception('failed');之后的print(Exception);是永远不会执行的死代码,可以直接删除。
内容的提问来源于stack exchange,提问作者Ranko Koturic
相关产品推荐
相关产品推荐

