Flutter学习之旅~Http请求封装

Flutter 插件之http(介绍、使用、二次封装) 在Flutter中使用http插件进行HTTP请求和文件操作是比较常见和方便的。接下来详细展示如何使用http插件实现携带Token进行后台校验,以及支持P请求方法,同时包括文件上传功能。通过使用http插件,你可以在Flutter应用中方便地实现携带Token进行后台校验、支持各种HTTP请求方法()以及文件上传功能。记得替换示例中的URL、Token和文件路径为实际的值,并根据具体需求处理请求和响应。这些功能可以帮助你构建功能强大的移动应用程序,与后端安全地通信。 阅读详情

刚开始接触Flutter,需要封装一个Http请求文件。废话不多直接上代码

1.设置全局变量,用来缓存Token信息

class Global {
  static String _tokenId = "";

  Global() {
    _tokenId = "";
  }

  //设置token信息
  static void setTokenId(val) {
    _tokenId = val;
  }

  //调用tokenId信息
  static String getTokenId() {
    return _tokenId;
  }

}

1.封装Http请求信息

import 'package:dio/dio.dart';
import 'package:/common/global.dart';

class HttpUtil {
  //实例化对象
  static HttpUtil _instance;
  Dio _dio;
  BaseOptions _options;

  CancelToken cancelToken = new CancelToken();

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

  /*
   * config it and create
   */
  HttpUtil() {
    //BaseOptions、Options、RequestOptions 都可以配置参数,优先级别依次递增,且可以根据优先级别覆盖参数
    var baseOptions = new BaseOptions(
      //请求基地址,可以包含子路径
      baseUrl: "http://127.0.0.1:8080",

      //连接服务器超时时间,单位是毫秒.
      connectTimeout: 30000,
      //响应流上前后两次接受到数据的间隔,单位为毫秒。
      receiveTimeout: 120000,
      //Http请求头.
      headers: {
        "Accept": "application/json",
        //do something
        "TokenId": Global.getTokenId(),
      },
      //请求的Content-Type,默认值是[ContentType.json]. 也可以用ContentType.parse("application/x-www-form-urlencoded")
      contentType: "application/json",
      //表示期望以那种格式(方式)接受响应数据。接受三种类型 `json`, `stream`, `plain`, `bytes`. 默认值是 `json`,
      responseType: ResponseType.json,
    );

    _options = baseOptions;
    _dio = new Dio(_options);
  }

  //设置初始化信息
  setBaseOptions(String tokenId) async {
    var baseOptions = new BaseOptions(
      //请求基地址,可以包含子路径
      baseUrl: "http://127.0.0.1:8080",
      //连接服务器超时时间,单位是毫秒.
      connectTimeout: 30000,
      //响应流上前后两次接受到数据的间隔,单位为毫秒。
      receiveTimeout: 120000,
      //Http请求头.
      headers: {
        "Accept": "application/json",
        //do something
        "TokenId": tokenId,
      },
      //请求的Content-Type,默认值是[ContentType.json]. 也可以用ContentType.parse("application/x-www-form-urlencoded")
      contentType: "application/json",
      //表示期望以那种格式(方式)接受响应数据。接受三种类型 `json`, `stream`, `plain`, `bytes`. 默认值是 `json`,
      responseType: ResponseType.json,
    );
    _options = baseOptions;
    _dio = new Dio(_options);
  }

  /*
   * get请求(不带参)
   */
  get(url) async {
    Response response;
    try {
      print('get:' + url);
      response = await _dio.get(url);
      // print('get success---------${response.statusCode}');
      print('get success:${response.data}');
      return response.data;
    } catch (e) {
      print('get error:$e');
      formatError(e);
    }
    return null;
  }

  /*
   * get请求参数传参
   */
  getData(url, {data}) async {
    Response response;
    try {
      print('get data:' + url);
      Map<String, dynamic> k = data;
      response = await _dio.get(url, queryParameters: k);
      // print('get success---------${response.statusCode}');
      print('get data success:${response.data}');
      return response.data;
    } catch (e) {
      print('get data error:$e');
      formatError(e);
    }
    return null;
  }

  /*
   * post请求,对象传参
   */
  postData(url, {data}) async {
    Response response;
    try {
      print('post data:' + url);
      response = await _dio.post(url, data: data);
      print('post data success:${response.data}');
      return response.data;
    } on DioError catch (e) {
      print('post data error:$e');
      formatError(e);
    }
    return null;
  }

  /*
   * post请求,参数传参
   */
  postParam(url, {data}) async {
    Response response;
    Map<String, dynamic> k = data;
    try {
      print('post param:' + url);
      response = await _dio.post(url, queryParameters: k);
      print('post param success:${response.data}');
      return response.data;
    } on DioError catch (e) {
      print('post param error:$e');
      formatError(e);
    }
    return null;
  }

  /*
   * 下载文件
   */
  downloadFile(urlPath, savePath) async {
    Response response;
    try {
      print('download :' + urlPath);
      response = await _dio.download(urlPath, savePath,
          onReceiveProgress: (int count, int total) {
        //进度
        print("现在进度: 当前:$count  总:$total");
      });
      if (response.data.statusCode == 200) {
        print('文件下载完成!:${response.data}');
        return true;
      }
    } on DioError catch (e) {
      print('downloadFile error:$e');
      formatError(e);
    }
    return false;
  }

  /*
   * 异常处理
   */
  void formatError(DioError e) {
    if (e.type == DioErrorType.CONNECT_TIMEOUT) {
      // It occurs when url is opened timeout.
      print("连接超时");
    } else if (e.type == DioErrorType.SEND_TIMEOUT) {
      // It occurs when url is sent timeout.
      print("请求超时");
    } else if (e.type == DioErrorType.RECEIVE_TIMEOUT) {
      //It occurs when receiving timeout
      print("响应超时");
    } else if (e.type == DioErrorType.RESPONSE) {
      // When the server response, but with a incorrect status, such as 404, 503...
      print("出现异常");
    } else if (e.type == DioErrorType.CANCEL) {
      // When the request is cancelled, _dio will throw a error with this type.
      print("请求取消");
    } else {
      //DEFAULT Default error type, Some other Error. In this case, you can read the DioError.error if it is not null.
      print("未知错误");
    }
  }
}

3.接口调用方式

import '/utils/httpUtils.dart';

HttpUtil _httpUtil;

@override
void initState() {
    _httpUtil = new HttpUtil();
}

//Body调用
var data = await _httpUtil.postData("/api/postData", data: {"a": '123'});

//参数调用
var data = await _httpUtil.getData("/api/getData", data: {"a": "123"});

//无参调用
var data = await _httpUtil.get('/api/get');

//post 参数调用
var data = await _httpUtil.postParam('/api/postParam', data: {"a": "123"});
if (data != null) {
    //重新刷新界面
    setState(() {});
}

 

Flutter 基于 dio 和 http 两种网络库的基础封装 立即下载

相关推荐

别再折腾CUDA了!Win11上VSCode一键配置PyTorch GPU环境(附Anaconda虚拟环境避坑指南)

本文提供Win11系统下使用VSCode和Anaconda一键配置PyTorch GPU环境的详细指南,解决CUDA版本冲突等常见问题。通过conda的原子化依赖解决方案,安装时间从2小时缩短至15分钟,适合深度学习初学者快速搭建开发环境。

weixin_33101399的博客 246

flutter http请求封装调用(注册)

flutter http请求封装(注册)

jiayuanwai的博客 587

从零到一:鲲鹏920服务器上的DeepSeek模型部署全流程解析

本文详细解析了在华为鲲鹏920服务器上部署DeepSeek模型的全流程,包括环境准备、模型服务框架部署、性能优化及生产环境方案。通过ARM架构优化和量化技术,显著提升模型推理效率,适用于企业级AI应用场景,助力国产化技术落地。

weixin_29094775的博客 599

flutter项目实战三:封装http工具类

创建http开发目录 Api.dart为接口地址 custom_Interceptors.dart 为拦截器 http_utils.dart 为实际的http工具类 统一header sendTimeout 发送超时 receiveTimeout 接收超时 get请求方式 post请求凡是 form表单请求方式 import 'dart:io'; import 'package:dio/dio.dart'; import 'package:mianzu_null_safety/http/Api.d.

骑猪也能看夕阳 3119

LangChain开发避坑指南:为什么Pylance总提示‘无法解析导入‘?实测7种修复方案

本文深入解析了在VS Code中使用LangChain开发时,Pylance频繁提示‘无法解析导入’的根本原因——Python解释器与语言服务器的环境路径不一致。文章提供了从基础排查到深度配置的7种实测修复方案,包括切换解释器、配置extraPaths、使用pyrightconfig.json等,旨在帮助开发者彻底解决此问题,提升AI应用开发效率。

weixin_28826521的博客 444

智能Agent如何重塑企业流程

在当今数字化时代,企业流程的效率和敏捷性至关重要。传统企业流程往往受限于人工操作,效率低下、成本高昂,难以适应快速变化的市场环境。智能Agent作为一种新兴技术,凭借其强大的智能化能力,正在逐渐改变企业流程的运作模式,为企业带来新的机遇和挑战。智能Agent是一种能够感知环境、自主决策、执行任务的软件实体。它可以模拟人类的智能行为,例如学习、推理、规划和沟通。通过将智能Agent嵌入到企业流程中,可以实现流程的自动化、优化和智能化,从而提高效率、降低成本、提升客户体验。8.1 研究成果总结。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 873

Flutter dio http 封装指南说明

本文介绍了如何实现一个通用、可重构的 Dio 基础类,包括单例访问、日志记录、常见操作封装以及请求、输出、报错拦截等功能。

会煮咖啡的猫咪 1125

利用恒源云云端GPU高效训练YOLOv11模型全流程:从环境搭建到模型部署,让你摆脱硬件束缚

记住,云端GPU的核心优势是“弹性算力+一键环境”,只要把握好这一工具特性,再结合YOLOv11的高性能模型架构,你也能在计算机视觉领域快速落地项目。接下来,我们从工具准备到模型部署,一步步带你实现高效训练,真正帮你解决资源与效率的核心痛点。凭借其在目标检测、实例分割任务上的卓越性能,成为众多开发者的首选。据统计,使用云端GPU训练YOLOv11,在处理百万级数据集时,训练效率较本地普通GPU提升。在安防监控中,YOLOv11可实时检测人员、车辆异常行为,某园区采用该方案后,异常事件识别准确率达。

LXY_LOVE36的博客 213

Flutter-网络请求封装

一、前言 网络请求是我们App开发过程中的重要内容,大部分App都需要和服务器进行数据交互,因此在开发过程中,我们需要封装我们网络请求的代码,对request、response以及error做统一处理,减少业务开发中的样板代码。 二、使用DIO进行网络通讯 2.1 配置网络请求的基本信息 关于dio的具体用法参考dio官方文档。按照下面方式配置diopackage: dependencies: dio: ^4.0.4 在网络请求中,我们通常需要配置服务器的地址以及超时等,这里我们新建一个http_co

mrRuby的博客 4322

【感知模块算法】障碍物detect+trace+prediction方向介绍

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、多维度看感知问题,体会复杂性二、障碍物/环境目标detect方向1.视觉目标检测方向(1)图像处理认知(2)视觉基础理论部分1、获取数据集---python网页爬虫、买数据、自己录数据、使用开源比赛的数据集2、opencv库的学习3、深度学习框架学习(3)视觉目标检测理论(1)目标检测的概念(2)目标检测的应用场景(3)现有目标检测框架原理及论文【这仅仅是我当初入门学习的框架~

qq_35635374的博客 2894

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之BswM模块配置详解(上)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之BswM模块配置详解(上)

weixin_42412049的博客 736

Flutter 网络请求框架封装

各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。BAT大厂面试题、独家面试工具包,资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可免费领取!

2401_83704192的博客 1603

Kappa函数:测量一致性并计算置信区间的R语言包

Kappa函数是一种常用的统计量,用于衡量两个评估者之间的一致性。在R语言中,有一个名为"vcd"的包提供了计算Kappa函数以及相应的置信区间的功能。本文将介绍如何使用"vcd"包来计算Kappa函数的值,并进一步计算置信区间。Kappa函数的值介于-1和1之间,值越接近1表示评估者之间的一致性越高,值越接近-1表示评估者之间的一致性越低,值接近0表示评估者之间的一致性接近于随机。通过以上步骤,我们成功地使用R语言中的"vcd"包计算了Kappa函数的值和置信区间。接下来,我们可以使用"vcd"包中的。

2301_79331230的博客 1875

Flutter http包的简单封装

Flutter http包的简单封装 文章目录依赖http网络请求类数据转换Example 依赖http dependencies: flutter: sdk: flutter #网络 http: ^0.13.1 执行 flutter pub get 网络请求类 import 'package:http/http.dart' as http; typedef onError = void Function(int statusCode, Object error); typed

K_Hello的博客 1120

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《玩转Flutter》之HTTP请求:Dio高效封装

Dio库高效封装,涵盖统一数据解析,错误统一处理、请求模拟,自动加载遮罩优化,结合请求重试与并发管理实战,助力Flutter开发者快速构建稳定可维护的HTTP交互模块。

liang07118916的专栏 366

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Flutter 网络请求与数据处理:从基础到单例封装

在 Flutter 开发中,网络请求是一个非常常见的需求,比如获取 API 数据、上传文件、处理分页加载等。为了高效地处理网络请求和数据管理,我们需要选择合适的工具并进行合理的封装。在实际项目中,网络请求通常需要统一管理,比如设置基础 URL、添加拦截器、处理错误等。通过单例模式封装网络请求,可以提高代码的复用性和可维护性。),并最终实现一个单例模式的网络请求封装,帮助你在项目中高效管理网络请求。提供了强大的拦截器功能,可以在请求前后进行统一处理。

风起云涌 1239

【Flutter 必备插件】HTTP 封装 dio

dio 是一个强大的 HTTP 网络请求库,支持全局配置、Restful API、FormData、拦截器、 请求取消、Cookie 管理、文件上传/下载、超时、自定义适配器、转换器等。

m0_74045553的博客 850

Flutter 网络请求框架封装(1)

var response = await dio.get(“/test?id=12&name=chen”); _content = response.data.toString(); }对于 query 参数,我们可以通过对象来进行传递,上面的代码等同于:void getRequest() async { Dio dio = new Dio(); var response = await dio.get(“/test”,data:{“id”:12,“name”:“chen”}); _content = re

2401_84009488的博客 658

Flutter学习(四)Http请求库 dio 代码封装

Flutter学习(四)Http请求库 dio代码封装 第一步 依赖库 打开flutter package网站,入口,找到dio这个组件,查看最新版本 打开 项目根目录下 ** pubspec.yaml ** 文件 添加库名,添加库名 最好是填写 any(** 添加兼容版本 **),也或者直接从网站复制最新版本即可, 执行 packages get 命令,安装依赖 代码部分 im...

尼伯特的博客 1万+

Flutter实现发送Http请求获取后端接口数据以及如何工程化封装返回数据

当我们在开发Flutter的时候,肯定会和后端接口对接去请求后端的数据,那么本次我们将,讲解Flutter如何请求数据,以及如何封装返回结果。 话不多说直接上代码,首先根据Flutter官方网站的描述,需要在pubspec.yaml引入一个http库这样就能够发送http请求了。 step1: #pubspec.yaml dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter #

weixin_43754303的博客 4448

flutter——将token放到本地缓存SharedPreferences

把上面的东西进行封装,就是把token sharedpreferences进行封装到一个文件,获取和设置token的时候会很方便。

z15267429952的博客 1438

Flutter 学习 之 DIO4.0 的封装

dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等…网址在右边 → [dio]

Eqiqi的博客 2162

Flutter Http请求库 dio 代码封装

Flutter Http请求库 dio 代码封装 ** 新增HttpUtils.dart ** import 'package:dio/dio.dart'; import 'dart:async'; //********************************************************************************** // // 文件名称:Htt...

weixin_42629287的博客 871

Flutter实战-请求封装(三)之http2

用了两年的flutter,有了一些心得,不虚头巴脑,只求实战有用,以供学习或使用flutter的小伙伴参考,学习尚浅,如有不正确的地方还望各路大神指正,以免误人子弟,在此拜谢~(原创不易,转发请标注来源和作者)注意:无特殊说明,flutter版本为3.0+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上篇文章我们对dio进行了封装,已经满足了基本使用,这一篇我们来对dio进行http2改造,使得

ITDogFire 697

Flutter 网络请求封装实战:打造高可用请求框架,告别回调地狱与数据解析痛点

dart// 引入反射生成文件(需配置build_runner)/// 请求方法枚举get,post,put,delete,patch,head,/// 请求状态枚举idle, // 初始状态loading, // 加载中success, // 成功failure, // 失败/// 缓存策略枚举noCache, // 不缓存cacheFirst, // 先读缓存,后请求更新networkFirst, // 先请求,失败读缓存。

2501_93817952的博客 655

一文带你掌握Flutter dio网络请求库的封装

将请求所需的参数进行封装,例如 URL、请求头、请求体等。可以定义一个统一的数据结构或模型类来表示请求参数,以便于传递和管理。将网络请求返回的响应结果进行封装,例如状态码、响应头、响应体等。同样,可以定义一个统一的数据结构或模型类来表示响应结果,以便于处理和解析。对网络请求可能出现的错误进行封装和处理,例如网络连接失败、超时、服务器错误等。可以定义自定义的异常类或错误码,以及相应的错误处理机制。如果第三方网络库支持拦截器机制,你可以封装拦截器,用于在请求发起前或响应返回后进行额外的处理,如添加身份验证、日志

我是程序员海军, 全栈开发 | AI爱好者 | 独立开发。 1164
上一篇: MFC 窗口标题和边框取消
下一篇: Flutter学习之旅~创建项目
leftstrange
博客等级 码龄15年 23粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值