Flutter中如何读取非JSON格式的API返回值?
解决Future调用API返回"pending"字符串的解析与取值问题
嘿,我看你遇到的问题挺典型的——API直接返回了纯字符串"pending",但你的代码里硬套了jsonDecode,还没正确处理Future的取值,导致拿不到想要的结果对吧?咱们来一步步搞定它:
问题根源拆解
- API返回格式不匹配:你的接口返回的是纯文本
pending,不是标准JSON格式,直接用jsonDecode肯定会报错,因为这个函数只认JSON结构的字符串。 - 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
相关产品推荐
相关产品推荐

