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

Flutter中使用HTTP Client无法向自定义API发送POST请求求助

Flutter POST请求失败排查与修复方案

问题核心分析

当前Flutter端GET请求正常,但POST请求返回Response was nothing,结合代码来看,主要问题集中在请求错误处理缺失、序列化逻辑不明确以及状态码覆盖不全这几个点上。

具体修复步骤

1. 完善BaseClient的POST方法(核心修复)

原POST方法仅处理201状态码,且未捕获请求异常,导致任何非201的情况都会返回null,触发错误提示。修改后添加异常捕获、状态码打印和完整的错误处理:

import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:flutter/foundation.dart';

const String BASE = "xxx";

class BaseClient {
  var client = http.Client();

  Future<dynamic> get(String api) async {
    var url = Uri.parse(BASE + api);
    var res = await client.get(url);
    if (res.statusCode == 200) {
      return res.body;
    } else {
      debugPrint('GET Status Code: ${res.statusCode}');
      throw Exception('GET request failed');
    }
  }

  Future<dynamic> post(String api, dynamic object) async {
    try {
      var url = Uri.parse(BASE + api);
      // 明确调用toJson方法,确保Item对象正确序列化为JSON
      var _payload = json.encode(object.toJson());
      var _headers = {'Content-Type': 'application/json; charset=UTF-8'};
      
      // 打印调试信息,对比Postman请求
      debugPrint('POST URL: $url');
      debugPrint('POST Payload: $_payload');
      
      var res = await client.post(url, body: _payload, headers: _headers);
      
      debugPrint('POST Status Code: ${res.statusCode}');
      debugPrint('POST Response Body: ${res.body}');

      // 兼容后端返回200或201的情况
      if (res.statusCode == 201 || res.statusCode == 200) {
        return res.body;
      } else {
        throw Exception('Request failed with status: ${res.statusCode}, response: ${res.body}');
      }
    } catch (e) {
      debugPrint('POST Request Error: $e');
      rethrow; // 重新抛出异常,让调用方处理
    }
  }

  Future<dynamic> put(String api) async {}
  Future<dynamic> delete(String api) async {}
}

2. 优化UI中的POST请求回调

修改回调逻辑,正确捕获异常并打印详细错误:

CustomButton(
  opr: "POST",
  desc: "Create Items",
  color: Colors.blue.shade400,
  onPressed: () async {
    var item = Item(
      title: "Complete Project",
      description: "", // 给nullable字段赋值,避免后端拒绝null
      color: "blue",
      completed: false,
      priority: true,
      itemImage: "",
      itemLink: "",
      dateTime: DateTime.now(),
    );
    try {
      var res = await BaseClient().post('/create', item);
      if (res != null) {
        debugPrint('POST successful, response: $res');
      } else {
        debugPrint("Response was nothing");
      }
    } catch (e) {
      debugPrint('POST Failed: $e');
    }
  },
),

3. 额外排查点

  • 验证BASE URL格式:确保BASE变量末尾带有斜杠(如https://your-api-domain.com/),避免拼接后出现xxxcreate这类错误URL。
  • 对比Postman请求:通过打印的POST Payload和URL,与Postman中成功请求的参数对比,确认字段名、数据格式完全一致。
  • CORS检查(Web端):如果是Flutter Web项目,需确认后端CORS配置允许POST请求,且允许当前前端域名访问。

内容的提问来源于stack exchange,提问作者GN Vageesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:01:30