| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- import 'dart:io';
- import 'package:dio/dio.dart';
- import 'package:flutter/foundation.dart';
- import 'global.dart';
- class Http {
- static final Http _instance = Http._internal();
- // 单例模式使用Http类,
- factory Http() => _instance;
- static late final Dio dio;
- final CancelToken _cancelToken = CancelToken();
- Http._internal() {
- // BaseOptions、Options、RequestOptions 都可以配置参数,优先级别依次递增,且可以根据优先级别覆盖参数
- BaseOptions options = BaseOptions();
- dio = Dio(options);
- // // 添加request拦截器
- // dio.interceptors.add(RequestInterceptor());
- // // 添加error拦截器
- dio.interceptors.add(ErrorInterceptor());
- // // // 添加cache拦截器
- // dio.interceptors.add(NetCacheInterceptor());
- // // // 添加retry拦截器
- // dio.interceptors.add(
- // RetryOnConnectionChangeInterceptor(
- // requestRetrier: DioConnectivityRequestRetrier(
- // dio: dio,
- // connectivity: Connectivity(),
- // ),
- // ),
- // );
- // 在调试模式下需要抓包调试,所以我们使用代理,并禁用HTTPS证书校验
- // if (PROXY_ENABLE) {
- // (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
- // (client) {
- // client.findProxy = (uri) {
- // return "PROXY $PROXY_IP:$PROXY_PORT";
- // };
- // //代理工具会提供一个抓包的自签名证书,会通不过证书校验,所以我们禁用证书校验
- // client.badCertificateCallback =
- // (X509Certificate cert, String host, int port) => true;
- // };
- // }
- }
- ///初始化公共属性
- ///
- /// [baseUrl] 地址前缀
- /// [connectTimeout] 连接超时赶时间
- /// [receiveTimeout] 接收超时赶时间
- /// [interceptors] 基础拦截器
- void init({
- String? baseUrl,
- int connectTimeout = 1500,
- int receiveTimeout = 1500,
- Map<String, String>? headers,
- List<Interceptor>? interceptors,
- }) {
- dio.options = dio.options.copyWith(
- baseUrl: baseUrl,
- // connectTimeout: connectTimeout, //引起报错 Future already completed
- receiveTimeout: receiveTimeout,
- headers: headers ?? const {},
- );
- // 在初始化http类的时候,可以传入拦截器
- if (interceptors != null && interceptors.isNotEmpty) {
- dio.interceptors.addAll(interceptors);
- }
- }
- // 关闭dio
- void cancelRequests({required CancelToken token}) {
- _cancelToken.cancel("cancelled");
- }
- // 添加认证
- // 读取本地配置
- Map<String, dynamic>? getAuthorizationHeader() {
- Map<String, dynamic> headers = {
- 'X-Client-Type':kIsWeb?"WEB":Platform.isAndroid ? "ANDROID" : "IOS",
- 'X-Client-Version':'1.0',
- 'X-App-Version':'1.0',
- 'Access-Control-Allow-Origin':'*'
- };
- // headers['Authorization'] = 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJhY2NvdW50Iiwic3ViIjoidGVzdCIsImlzcyI6IkNPREVQQUFTLkNPTSIsIm5pY2tuYW1lIjoidGVzdCIsInR5cCI6IkJlYXJlciIsInNlc3Npb25fc3RhdGUiOiIzMjJhMzRkNzlkZWQxN2E4ZWMyYmJlNWVlZmJhNjQ4NyIsImV4cCI6MTY5MTU5NTMxOSwiaWF0IjoxNjYwMDU5MzE5fQ.A0Z3m_2WAj4DOJLdu42jXnUeX0X3T0-HkdU4BNtJ_8k';
- // 从getx或者sputils中获取
- // String accessToken = Global.accessToken;
- String accessToken = Global().token;
- if (accessToken.isNotEmpty) {
- headers['Authorization']='Bearer $accessToken';
- }
- else {
- headers['Authorization'] = 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNzUyOTA4NDhiODNkYjNlOTQ5ZmEwMzBiYTU0OTliNjgiLCJpc3MiOiJDT0RFUEFBUy5DT00iLCJuaWNrbmFtZSI6IueDrSIsInR5cCI6IkJlYXJlciIsInNlc3Npb25fc3RhdGUiOiI0MGU2ODZlMjg1ZGQ5OTdkNjlkNWNjOGVkMWZmZGE5NCIsImV4cCI6MTY5MzU1NTI4OSwiaWF0IjoxNjYyMDE5MjkwfQ.xcTj1OUiwAlMG7KAr9QG9obxZi1d2Vi8rCeJPT_Mmtc';
- }
- return headers;
- }
- Future get(
- String path, {
- Map<String, dynamic>? params,
- Options? options,
- CancelToken? cancelToken,
- bool refresh = false,
- bool noCache = true,
- String? cacheKey,
- bool cacheDisk = false,
- }) async {
- Options requestOptions = options ?? Options();
- requestOptions = requestOptions.copyWith(
- extra: {
- "refresh": refresh,
- "noCache": noCache,
- "cacheKey": cacheKey,
- "cacheDisk": cacheDisk,
- },
- );
- Map<String, dynamic>? _authorization = getAuthorizationHeader();
- if (_authorization != null) {
- requestOptions = requestOptions.copyWith(headers: _authorization);
- }
- // try {
- Response response;
- response = await dio.get(
- path,
- queryParameters: params,
- options: requestOptions,
- cancelToken: cancelToken ?? _cancelToken,
- );
- return response.data;
- // } on DioError catch (e) {
- // if (e.response)
- // // return e.response!.data;
- // }
- }
- Future post(
- String path, {
- Map<String, dynamic>? params,
- data,
- Options? options,
- CancelToken? cancelToken,
- }) async {
- Options requestOptions = options ?? Options();
- Map<String, dynamic>? _authorization = getAuthorizationHeader();
- if (_authorization != null) {
- requestOptions = requestOptions.copyWith(headers: _authorization);
- }
- var response = await dio.post(
- path,
- data: data,
- queryParameters: params,
- options: requestOptions,
- cancelToken: cancelToken ?? _cancelToken,
- );
- if (response.data is String){
- return Map<String, dynamic>();
- }
- return response.data;
- }
- Future put(
- String path, {
- data,
- Map<String, dynamic>? params,
- Options? options,
- CancelToken? cancelToken,
- }) async {
- Options requestOptions = options ?? Options();
- Map<String, dynamic>? _authorization = getAuthorizationHeader();
- if (_authorization != null) {
- requestOptions = requestOptions.copyWith(headers: _authorization);
- }
- var response = await dio.put(
- path,
- data: data,
- queryParameters: params,
- options: requestOptions,
- cancelToken: cancelToken ?? _cancelToken,
- );
- return response.data;
- }
- Future patch(
- String path, {
- data,
- Map<String, dynamic>? params,
- Options? options,
- CancelToken? cancelToken,
- }) async {
- Options requestOptions = options ?? Options();
- Map<String, dynamic>? _authorization = getAuthorizationHeader();
- if (_authorization != null) {
- requestOptions = requestOptions.copyWith(headers: _authorization);
- }
- var response = await dio.patch(
- path,
- data: data,
- queryParameters: params,
- options: requestOptions,
- cancelToken: cancelToken ?? _cancelToken,
- );
- return response.data;
- }
- Future delete(
- String path, {
- data,
- Map<String, dynamic>? params,
- Options? options,
- CancelToken? cancelToken,
- }) async {
- Options requestOptions = options ?? Options();
- Map<String, dynamic>? _authorization = getAuthorizationHeader();
- if (_authorization != null) {
- requestOptions = requestOptions.copyWith(headers: _authorization);
- }
- var response = await dio.delete(
- path,
- data: data,
- queryParameters: params,
- options: requestOptions,
- cancelToken: cancelToken ?? _cancelToken,
- );
- return response.data;
- }
- }
- class ErrorInterceptor extends Interceptor {
- @override
- void onError(DioError err, ErrorInterceptorHandler handler) {
- if (err.response!.statusCode == 401) {
- // print('9527');
- // if (Global().showLogin){
- // return;
- // }
- // Global().mainPage.logout();
- // Global().showLogin = true;
- return;
- }
- // if (err.response!.statusCode == 500) {
- // print('9527');
- // return;
- // }
- // if (err.response!.statusCode == 422) {
- // // print('9527逆龄石不足');
- // return;
- // }
- // if (err.response!.statusCode != 200) {
- // // ignore: void_checks
- // return err.response!.data;
- // }
- super.onError(err, handler);
- }
- @override
- void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
- // TODO: implement onRequest
- super.onRequest(options, handler);
- }
- @override
- void onResponse(Response response, ResponseInterceptorHandler handler) {
- // TODO: implement onResponse
- super.onResponse(response, handler);
- }
- }
|