山东大学软件学院2021级创新项目实训个人工作内容汇报

创新项目实训项目:基于生成式AI的英语口语助手

负责部分:前端

代码内容分析:request.dart

定义了一个在 Dart 中常见的泛型类 Result<T>,该类被用于包装从网络请求、数据库操作或其他可能返回成功或失败结果的操作中得到的数据。这个类使用了 JsonSerializable 注解,用于自动生成 JSON 序列化和反序列化的代码。
属性:
success:一个布尔值,表示操作是否成功。
message:一个可选的字符串,可能包含操作的结果信息或错误信息。
token:一个可选的字符串,可能包含某种认证令牌。
loginValid:一个可选的布尔值,可能表示登录状态是否有效。
content:一个动态类型,可以包含任何类型的数据。

构造函数:命名构造函数,它接收上述的所有属性作为参数(其中 success、message 和 loginValid 是必需的)。

工厂方法 fromJson:接收一个 Map<String, dynamic> 类型的 JSON 数据,并返回一个 Result 对象。在这个方法中,它尝试从 JSON 数据中解析出对应的属性。如果某个属性不存在(如 token 或 loginValid),它会使用一个默认值(如空字符串或 false)。
方法 toJson:这个方法将 Result 对象转换为一个 Map<String, dynamic> 类型的 JSON 数据。
它只包含了 success 和 message 属性。

YzmError类:late 关键字用于声明一个非空(non-nullable)的实例变量,这个变量在声明时不需要立即初始化,但必须在构造函数调用完成之前被赋值。这通常用于在构造函数体中或在构造函数的初始化列表中给变量赋值。

上述代码定义了一个名为 ApiClient 的类,该类用于封装和管理 HTTP 请求库 Dio 的实例。

类成员变量:late Dio _dio;:声明了一个类型为 Dio 的成员变量 _dio,并使用 late 关键字表示该变量将在类的实例化过程中被延迟初始化。Dio 是一个流行的 Dart HTTP 客户端库。
私有构造函数 ApiClient._internal():这是一个私有构造函数(由于名称以下划线 _ 开头,因此它是私有的),它负责初始化 _dio 实例,并为其添加拦截器。
在构造函数中,创建了一个 Dio 实例,并为其配置了基础选项(如超时时间)。
使用了两个拦截器:LogInterceptor 用于记录请求和响应的日志,NetInterceptor用于处理网络请求的其他逻辑。
设置了 HttpClient 的 badCertificateCallback 函数,这个函数在客户端遇到无效或不受信任的 SSL 证书时被调用。这里它被设置为总是返回 true,这意味着客户端将忽略证书错误并继续与服务器通信。
单例模式 static final ApiClient _instance = ApiClient._internal():使用静态成员变量 _instance 保存了 ApiClient 的一个实例。这个实例在类加载时就被创建,并且只会被创建一次。
factory ApiClient():这是一个工厂方法,用于返回 ApiClient 的单例实例。由于 ApiClient 的构造函数是私有的,因此无法从外部直接创建其实例,只能通过这个工厂方法来获取。

这段代码定义了一个名为 postRequest 的异步方法,用于发送一个 HTTP POST 请求。下面是对代码中各个部分的详细分析:

方法定义
返回类型:Future<void>,表示这个方法是一个异步方法,并且没有返回值。
参数:
url:请求的 URL,类型为 String,并且是必需的。
request:要发送的请求体,类型为 Map<String, dynamic>,并且是必需的。
reqeustSuccess:当请求成功时调用的回调函数,接收一个 Result 类型的参数。
requestFail:当请求失败时调用的回调函数,接收一个 YzmError 类型的参数。
headers:请求头,类型为 Map<String, dynamic>,有一个默认值 const <String, dynamic>{}。


方法内部
变量初始化:
extra:一个空的 Map<String, dynamic>。
queryParameters:一个空的 Map<String, dynamic>。
data:一个空的 Map<String, dynamic>,然后将 request 的内容添加到 data 中。
value:一个 Result 类型的对象,初始化时设置了 success 为 false,message 为 "message",loginValid 为 false。
发送请求:
使用 _dio 对象的 fetch 方法发送 POST 请求。
_setStreamType<Result<String>> 方法被用来处理 Options 对象。
compose 方法用于组合多个 Options 对象,我们使用了 url、queryParameters 和 data。
请求的数据是通过 json.encode(data) 编码为 JSON 格式的。
处理响应:
如果请求成功,将结果传递给 _requestInfo 方法。
如果请求失败,捕获异常 e,创建一个 YzmError 对象,并设置其 errorMsg 属性为 formatError(e) 的结果。然后调用 requestFail 回调函数。

_setStreamType<T>(RequestOptions requestOptions):一个泛型方法,用于设置 Dio 请求的响应类型。它接受一个 RequestOptions 对象作为参数,并根据泛型类型 T 来设置响应类型。

如果 T 不是 dynamic 并且 requestOptions 的 responseType 也不是 bytes 或 stream,则会进一步判断 T 的类型:
如果 T 是 String,则设置 responseType 为 plain。
否则,设置 responseType 为 json。

_requestError(Result value)
这个方法创建一个 YzmError 对象,用于包装请求失败的错误信息。它只使用了 value 对象的 message 属性(如果存在),并返回一个填充了错误信息的 YzmError 对象。

_requestInfo:异步方法,用于处理网络请求的返回信息。它接受一个 value、result(Dio 请求的响应结果)、reqeustSuccess(请求成功时的回调函数)和 requestFail(请求失败时的回调函数)作为参数。

首先,它检查响应的 statusCode 是否为 200,如果不是,则认为请求失败,并创建一个 YzmError 对象来包装 DioException,并调用 requestFail 回调函数。
如果 statusCode 是 200,则尝试从响应数据中解析出业务数据,并更新 value 对象。
接下来,它检查解析出的 value 对象是否成功(即 value.success 是否为 true)。如果不是,则调用 _requestError 方法来创建一个 YzmError 对象,并调用 requestFail 回调函数。
如果 value 对象成功,并且包含了一个 token,则将其保存到 SharedPreferences 中。
最后,如果一切正常,调用 reqeustSuccess 回调函数并传递更新后的 value 对象。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值