首先我们是基于dio这个库进行二次封装, 实现axios在client端一样请求拦截,响应拦截等全局处理。
1.下载依赖
这是dio的中文文档https://github.com/cfug/dio/blob/main/dio/README-ZH.md,里面介绍的信息都挺详细的,还有各种其它依赖库。
dart pub add dio
2.封装dio
此处有以下几个注意点
- HttpService这个类,我使用get_it把这个类注册成单例,并且使用依赖注入https://www.jianshu.com/p/898f77ca6337,可以参考这个文章
- 因为网络请求完成后,我们拿到的是json数据,我们需要把json转化成对象,这时候我们就需要在请求中接受一个fromJson,将接受后的json对象转化成对象。https://www.jianshu.com/p/40ab9016d004,可以参考这个文章
- 使用了dotenv配置环境变量,https://www.jianshu.com/p/eb6a01691c97,可以参考这个文章
import 'package:dio/dio.dart';
import 'package:flutter_application_1/model/result.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
typedef FromJson<T> = T Function(Map<String, dynamic>);
class HttpService {
late Dio _dio;
HttpService() {
_dio = Dio(BaseOptions(
baseUrl: dotenv.env['BASE_URL'] ?? "",
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
));
_dio.interceptors.add(InterceptorsWrapper(
onRequest: (options, handler) {
final xKongUserId = dotenv.env['X_KONG_USER_ID'];
final xKongCountry = dotenv.env['X_KONG_COUNTRY'];
options.headers['Cookie'] =
'x_kong_user_id=$xKongUserId;x_kong_country=$xKongCountry';
return handler.next(options);
},
));
_dio.interceptors.add(InterceptorsWrapper(
onResponse: (response, handler) {
return handler.next(response);
},
onError: (error, handler) {
return handler.next(error);
},
));
}
Future<Result<T>> _request<T>(String url,
{String method = 'get',
Map<String, dynamic>? data,
Map<String, dynamic>? queryParameters,
required FromJson<T> fromJson}) async {
final response = await _dio.request(url,
data: data,
queryParameters: queryParameters,
options: Options(method: method));
final result = Result.fromResponse(response.data, fromJson);
return result;
}
Future<Result<T>> get<T>(String url,
{Map<String, dynamic>? queryParameters, required FromJson<T> fromJson}) {
return _request<T>(url,
queryParameters: queryParameters, fromJson: fromJson);
}
Future<Result<T>> post<T>(String url,
{Map<String, dynamic>? data, required FromJson<T> fromJson}) {
return _request<T>(url, method: 'post', data: data, fromJson: fromJson);
}
}
import 'package:flutter_application_1/model/page.dart';
class Result<T> {
String code;
String? message;
Page? page;
T? data;
Result({required this.code, this.message, this.data, this.page});
factory Result.fromResponse(Map<String, dynamic> response,
T Function(Map<String, dynamic>) fromJson) {
Page page = Page();
if (response['page'] != null) {
page = Page.fromJson(response['page']);
}
T data = fromJson(response['data']);
String message = response['message'];
String code = response['code'] ?? '200';
return Result(
code: code,
message: message,
page: page,
data: data,
);
}
}
import 'package:json_annotation/json_annotation.dart';
part 'page.g.dart';
@JsonSerializable()
class Page {
int? pageNo;
int? pageSize;
int? count;
Page({
this.pageNo,
this.pageSize,
this.count,
});
factory Page.fromJson(Map<String, dynamic> json) => _$PageFromJson(json);
Map<String, dynamic> toJson() => _$PageToJson(this);
}
网友评论