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安全问题
原模型中存在两处关键问题:
Answer类的data和links使用required修饰,但API返回的JSON中这两个字段可能为null,直接强转会触发类型错误。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
相关产品推荐
相关产品推荐

