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

Flutter天气应用调用OpenWeatherAPI报400及JSON解析问题求助

Flutter天气应用JSON解析及请求错误解决方案

核心错误排查

你控制台返回的{"cod":"400","message":"Nothing to geocode"}是OpenWeatherMap接口直接返回的错误,含义是请求时传入的城市参数为空,这是触发后续异常的直接原因:

  • 先在getWeather方法入口添加打印print('传入的城市参数为:$name'),验证是否上层调用时没有正确取到搜索框输入的内容就发起了请求
  • 临时把请求参数里的q写死为固定城市名比如'shanghai'测试,如果能返回200状态码的正常数据,直接修改UI层的搜索框取值逻辑,确保点击下一步时确实把输入内容传给了getWeather方法

Model类解析逻辑修复

即使接口返回正常数据,你当前的Model类也会触发解析异常,需要做以下修改:

  1. 修复字段类型不匹配问题:WeatherAppDetails类中的message字段不要定义为double类型,接口异常时返回的message是字符串格式,改为dynamic类型避免类型转换报错
  2. 补全fromJson方法的字段赋值:你当前的WeatherAppDetails.fromJson里完全没有处理city字段,要补全赋值逻辑
  3. 删除不必要的非空断言:City.fromJson里coord赋值末尾的!要删掉,避免接口返回空值时直接抛出空异常

修改后的WeatherAppDetails.fromJson参考代码:

WeatherAppDetails.fromJson(Map<String, dynamic> json) {
  cod = json['cod'];
  message = json['message'] is num ? (json['message'] as num).toDouble() : 0;
  cnt = json['cnt'];
  city = json['city'] != null ? City.fromJson(json['city']) : null;
  if (json['list'] != null) {
    list = <ListDetails>[];
    json['list'].forEach((v) {
      list!.add(ListDetails.fromJson(v));
    });
  }
}

补充错误捕获逻辑

调用getWeather的位置要套try catch处理异常,避免请求失败直接崩溃:

try {
  var data = await DataService().getWeather(inputCityName);
  print('解析成功,城市名称:${data.city?.name}');
} catch (e) {
  print('请求/解析失败:$e');
  // 可在此处添加用户提示,比如"城市不存在,请重新输入"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:36:03