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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:27:30