如何在发送HTTP请求的登录方法中实现try语句并返回状态码?
实现登录方法异常时返回对应状态码
要实现异常时返回状态码而非打印信息,你可以针对不同类型的异常构造对应的http.Response对象,确保方法始终返回符合类型要求的响应,同时携带错误状态码和信息。以下是修改后的代码:
import 'dart:convert'; import 'dart:io'; // 导入用于捕获网络类异常 import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import '../Services/baseHttp.dart' as base; class Services { late var token = ''; Future<http.Response> login(String username, String password) async { try { var url = base.BaseURL.loginUrl; Map data = {"username": username, "password": password}; var body = json.encode(data); var response = await http.post(Uri.parse(url), headers: { "Content-Type": "application/json", "Accept": "application/json" }, body: body); print(response.statusCode); token = response.body; print(token); return response; } on SocketException { // 网络连接异常,返回408请求超时状态码 return http.Response(json.encode({"error": "网络连接失败"}), 408); } on FormatException { // JSON解析异常,返回400请求无效状态码 return http.Response(json.encode({"error": "数据解析失败"}), 400); } catch (e) { // 其他未知异常,返回500服务器错误状态码 return http.Response(json.encode({"error": "未知错误: $e"}), 500); } } }
关键说明:
- 捕获特定异常:通过
on SocketException、on FormatException分别捕获网络连接、数据解析这类常见异常,返回对应HTTP标准状态码,让上层逻辑可以根据状态码区分错误类型。 - 构造响应对象:在每个异常分支里,手动创建
http.Response实例,包含错误描述的JSON body和对应状态码,保证方法返回值始终符合Future<http.Response>类型要求,避免返回空值。 - 统一兜底处理:最后的
catch (e)处理所有未匹配的异常,返回500状态码并携带异常信息,方便调试。
内容的提问来源于stack exchange,提问作者Alex Wright
相关产品推荐
相关产品推荐

