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

Flutter中如何读取非JSON格式的API返回值?

解决Future调用API返回"pending"字符串的解析与取值问题

嘿,我看你遇到的问题挺典型的——API直接返回了纯字符串"pending",但你的代码里硬套了jsonDecode,还没正确处理Future的取值,导致拿不到想要的结果对吧?咱们来一步步搞定它:

问题根源拆解

  1. API返回格式不匹配:你的接口返回的是纯文本pending,不是标准JSON格式,直接用jsonDecode肯定会报错,因为这个函数只认JSON结构的字符串。
  2. Future取值方式不对:调用getOtp这种异步Future函数时,直接调用会返回一个Future对象,必须通过await或者.then()才能拿到实际的返回内容。

修改后的代码示例

首先调整getOtp函数,去掉不必要的JSON解析,直接返回接口的纯文本响应:

// 明确指定返回类型为Future<String>,让代码更清晰
Future<String> getOtp(String rollNumber, String phoneNumber, String schoolName) async {
  Response response = await post(genOtpUrl, body: {
    "rollNumber": rollNumber,
    "phNumber": phoneNumber,
    "schoolName": schoolName
  });
  print(response.body);
  // 直接返回纯文本响应,不用JSON解析
  return response.body;
}

然后是正确的调用方式,两种任选其一:

方式1:用await(需在async函数内使用)

void fetchOtp() async {
  // 用await等待Future完成,拿到实际的字符串结果
  String otpStatus = await getOtp("你的学号", "你的手机号", "学校名称");
  print("接口返回结果:$otpStatus"); // 这里会输出pending
  // 接下来可以根据返回的pending做后续逻辑处理
}

方式2:用.then()回调

void fetchOtp() {
  getOtp("你的学号", "你的手机号", "学校名称").then((otpStatus) {
    print("接口返回结果:$otpStatus"); // 同样输出pending
    // 后续逻辑处理写在这里
  });
}

额外提示

如果后续API可能返回JSON格式的成功响应(比如包含otp的对象),你可以加个判断逻辑,兼容两种返回情况:

Future<dynamic> getOtp(String rollNumber, String phoneNumber, String schoolName) async {
  Response response = await post(genOtpUrl, body: {
    "rollNumber": rollNumber,
    "phNumber": phoneNumber,
    "schoolName": schoolName
  });
  print(response.body);
  try {
    // 尝试解析JSON,如果成功就返回解析后的对象
    return jsonDecode(response.body);
  } catch (e) {
    // 解析失败说明是纯文本,直接返回原字符串
    return response.body;
  }
}

这样不管接口返回纯文本还是JSON,你的代码都能正确处理啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:07:45