记flutter dio使用过程中遇到的两个问题

本文深入探讨了Flutter中Dio库的使用技巧,重点讲解了如何使用FormData类构建form-data类型的POST请求,以及如何正确指定泛型以处理不同类型的数据响应。通过实例展示了自定义拦截器的实现,以自动填充header中的token数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、dio使用post请求时,如果content-type是form-data,我们需要通过FormData类来构建数据,否则服务器将无法识别,同时需要传入一个Option指明content-type,而form-data的content-type完整类型表述为:multipart/form-data,昨天在这两个问题上卡了很久,归根结底还是自己对于http协议不够熟悉,以后还需要加强这方面的知识。
2、使用dio的get post方法时,如果没有指明泛型类型,那么返回的Response对象的data变量,默认应该是String,这时候是不能直接传入实体类的fromJson方法的,最好是指定泛型为Map<String,dynamic>,这样返回的数据就是一个json序列化字符串了,然后再解析就行了。
下面是我封装的dio请求数据

import 'package:dio/dio.dart';

import 'common_interceptor.dart';

class HttpManager {
  static HttpManager _instance;

  static HttpManager getInstance() {
    if (_instance == null) {
      _instance = HttpManager();
    }
    return _instance;
  }

  Dio _dio = Dio();
  String host = "这里填入服务器地址";

  HttpManager() {
    _dio.options.baseUrl = "http://$host/";
    _dio.options.connectTimeout = 3000;
    _dio.options.receiveTimeout = 3000;
    _dio.interceptors.add(CommonInterceptor());//这里自定义了一个拦截器,用于在header里面自动填入token数据
    _dio.interceptors
        .add(LogInterceptor(responseBody: true, requestBody: true));
  }

  Future<Map<String, dynamic>> get(
      String path, Map<String, dynamic> params) async {
    var response =
        await _dio.get<Map<String, dynamic>>(path, queryParameters: params);
    return response.data;
  }

  Future<Map<String, dynamic>> postByFormData(
      String path, Map<String, dynamic> params) async {
    var data = FormData.fromMap(params);
    var response = await _dio.post<Map<String, dynamic>>(path,
        data: data, options: Options(contentType: "multipart/form-data"));
    return response.data;
  }

  Future<Map<String, dynamic>> postByJson(
      String path, Map<String, dynamic> params) async {
    var response = await _dio.post<Map<String, dynamic>>(path,
        data: params, options: Options(contentType: "application/json"));
    return response.data;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值