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

Flutter HTTP请求返回Null,Postman可正常获取API数据

问题分析与解决方案

核心问题

虽然HTTP状态码返回200,但API返回的JSON结构与你的数据模型不兼容,同时请求代码存在参数硬编码的问题,导致解析时出现Null类型转换错误。


步骤1:修复请求参数硬编码问题

你的函数接收search参数,但请求体里固定传入"oop",这会导致实际请求的关键词与预期不符,API可能返回空数据结构。修改请求代码:

Future<List<AnswerData>> searchAnswers({required String search}) async {
    final response = await post(
    Uri.parse("$_url/search"),
    headers:  <String, String>{
      'Content-Type': "application/json",
      'Connection' : 'keep-alive',
      'Accept' : '*/*',
    },
    // 替换硬编码值为传入的search参数
    body: jsonEncode(<String, String>{"search" : search})
    );
    // 新增:打印完整响应体,确认返回的JSON结构
    print("Response body: ${response.body}");
    print("status code${response.statusCode}");
    final answers = answerFromJson(response.body);
    print("msg error ${answers.data}");
    // 避免返回null,返回空列表兜底
    return answers.data ?? [];
  }

步骤2:修复数据模型的Null安全问题

原模型中存在两处关键问题:

  1. Answer类的data和links使用required修饰,但API返回的JSON中这两个字段可能为null,直接强转会触发类型错误。
  2. AnswerData的字段为必填String,但JSON中字段可能为null,导致类型不匹配。

修改后的模型代码:

import 'dart:convert';

Answer answerFromJson(String str) => Answer.fromJson(json.decode(str));

String answerToJson(Answer data) => json.encode(data.toJson());

class Answer {
  Answer({
    this.data = const [],
    this.links,
  });

  List<AnswerData>? data;
  Links? links;

  factory Answer.fromJson(Map<String, dynamic> json) => Answer(
    // 处理data为null的情况,返回空列表
    data: json["data"] == null 
        ? []
        : List<AnswerData>.from(json["data"].map((x) => AnswerData.fromJson(x))),
    // 处理links为null的情况
    links: json["links"] == null ? null : Links.fromJson(json["links"]),
  );

  Map<String, dynamic> toJson() => {
    "data": data?.map((x) => x.toJson()).toList(),
    "links": links?.toJson(),
  };
}

class AnswerData {
  AnswerData({
    this.title = "",
    this.text = "",
    this.link = "",
    this.course = "",
  });

  String title;
  String text;
  String link;
  String course;

  factory AnswerData.fromJson(Map<String, dynamic> json) => AnswerData(
    // 字段为null时返回空字符串兜底
    title: json["title"] ?? "",
    text: json["text"] ?? "",
    link: json["link"] ?? "",
    course: json["course"] ?? "",
  );

  Map<String, dynamic> toJson() => {
    "title": title,
    "text": text,
    "link": link,
    "course": course,
  };
}

class Links {
  Links({
    this.first = "",
    this.last = "",
    this.prev,
    this.next,
  });

  String first;
  String last;
  dynamic prev;
  dynamic next;

  factory Links.fromJson(Map<String, dynamic> json) => Links(
    first: json["first"] ?? "",
    last: json["last"] ?? "",
    prev: json["prev"],
    next: json["next"],
  );

  Map<String, dynamic> toJson() => {
    "first": first,
    "last": last,
    "prev": prev,
    "next": next,
  };
}

关键调试建议

打印完整的response.body,对比Postman中返回的JSON结构,确认以下内容:

  • API返回的data和links字段是否存在,是否为null
  • 字段名称是否与模型中定义的完全一致(注意大小写)
  • 请求头是否与Postman中的配置一致(比如是否遗漏了授权头)

内容的提问来源于stack exchange,提问作者Osama Mohammed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:35:15