DeekWeb
DeekWeb 是一个强类型 Dart / Flutter REST 客户端。
DeekWeb 的目标是提供一种机制,以提供一个一致的、强类型的 Web 请求框架。它为您提供了一种在应用程序的逻辑与调用服务器并将结果解析为类的逻辑之间进行清晰分离的机制。
DeekWebClient 与 json_serializable 结合使用,作为解析响应的框架效果很好。
为什么选择 DeekWeb?
使用 Dart / Flutter 相对于其他框架的主要优势之一是,它是一个现代的、强类型的、空安全的框架。那么,您的网络访问是否也应该具有相同的优势呢?
DeekWeb 使您能够预先定义一次合同,并在需要的地方使用它们,保持您的逻辑干净、安全且易于阅读。
这里的做法深受 Android 的 Volley 的启发,但已针对异步环境进行了现代化改造。
入门
首先,通过扩展 **DeekWebRequest** 来定义一个请求。
class MyRequest extends DeekWebRequest<MyResponseType> {
@override
Method get method => Method.get;
@override
Uri get uri => Uri.parse("https://www.myserver.com/myendpoint");
@override
Map<String, String> get headers {
return {
"someHeader": "someValue"
};
}
@override
Response<MyResponseType>? parseResponse(DeekWebHttpResponse response) {
if (response.statusCode == 200) {
var decoded = jsonDecode(response.body);
return MyResponseType.fromJson(decoded);
} else {
return null;
}
}
}
然后,使用 **DeekWebClient** 执行您的请求。
Future<MyResponseType> getResponse() async {
var request = MyRequest();
var client = DeekWebClient();
var response = await client.executeRequest(request);
return response;
}
高级功能
日志记录
您可以将日志记录器类传递给您的 `DeekWebClient` 类。客户端将在整个请求过程中记录各种事件和更改。原始请求/响应不会被记录。
class MyLogger implements DeekWebLogger {
verbose(String logLine) => print(logline);
info(String logLine) => print(logline);
warn(String logLine) => print(logline);
error(String logLine, {Exception? e}) => print("$logline: ${e ?? 'null'}");
}
void makeRequest() {
var client = DeekWebClient(logger: MyLogger());
/// execute requests like normal
}
相关性向量
DeekWebClient 已经为每个请求生成了一个唯一的 ID。想将其包含在请求头中吗?相关性向量 可以是一个强大的调试工具,可以将 ID 从客户端发送到服务器,并用于跨系统的日志跟踪请求。
如果您想将您的 requestId 作为 header 包含在内,请在 `DeekWebClient` 构造函数中进行指定。
void makeRequest() {
var client = DeekWebClient(includeCvHeader: true, cvHeader: 'My-CV');
/// execute requests like normal
}
监听器
您可能会发现了解哪些请求正在运行及其状态很有用。例如,您的应用程序可能在请求进行时显示同步指示器。您可以将一个监听器连接到您的 `DeekWebClient`,它将在请求开始/完成时通知您。
class MyListener implements DeekWebListener {
@override
void requestCompleted({required String requestId, required int statusCode}) {
/// Do something when requests complete
}
@override
void requestCompletedWithError(
{required String requestId, int? statusCode, String? error}) {
/// Do something when requests fail
}
@override
void requestStarted(
{required String requestId, required String requestType}) {
/// Do something when requests start
}
}
void makeRequest(MyListener requestListener) {
var client = DeekWebClient(listener: requestListener);
/// execute requests like normal
}