美文网首页
Flutter封装http,请求拦截,响应拦截等

Flutter封装http,请求拦截,响应拦截等

作者: Poppy11 | 来源:发表于2023-12-18 10:30 被阅读0次

    首先我们是基于dio这个库进行二次封装, 实现axios在client端一样请求拦截,响应拦截等全局处理。

    1.下载依赖

    这是dio的中文文档https://github.com/cfug/dio/blob/main/dio/README-ZH.md,里面介绍的信息都挺详细的,还有各种其它依赖库。

    dart pub add dio
    

    2.封装dio

    此处有以下几个注意点

    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);
    }
    
    

    相关文章

      网友评论

          本文标题:Flutter封装http,请求拦截,响应拦截等

          本文链接:https://www.haomeiwen.com/subject/igrogdtx.html