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

2023-12-18  本文已影响0人  Poppy11

首先我们是基于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);
}

上一篇下一篇

猜你喜欢

热点阅读