前言:

兄弟们,网络真是个好东西,里面去个个都是人才,说话又好听,超喜欢在里面。

确实,网络已经是我们日常生活中密不可分的一部分了

那咱们今天就来讲讲Flutter里的网络。

本节内容:

1.Dart 原生的网络请求 HttpClient

2.第三方网络请求 http

3.Flutter 发布的 dio (这个可是不得了)

1.Dart 原生的网络请求 HttpClient

对于初学者来说,使用dart 中的HttpClient发起的请求,能快速接入HTTP网络请求。

HttpClient本身功能较弱,很多常用功能都不支持。

第一步:导入dart:io包
import 'dart:io';
第二步:创建一个HttpClient
HttpClient httpClient = new HttpClient();

该 httpClient支持常用的HTTP操作: such as GET, POST, PUT, DELETE.

第三步:打开Http连接,设置请求头
Uri uri=Uri(scheme: "https", host: "flutterchina.club", queryParameters: {"userName":"chen","password":"123456"}); //在这里可以设置比如 Get 请求、Post 请求、Delete 请求HttpClientRequest request = await httpClient.getUrl(uri);
第四步:等待连接服务器(异步请求哦)
HttpClientResponse response = await request.close();
第五步:读取响应内容
if (response.statusCode == HttpStatus.ok) {_content = await response.transform(Utf8Decoder()).join();
}
第六步:断开连接
httpClient.close();

这是最简单的方法,但是过于麻烦,还有 Cookie 的管理也是比较困难的

2.第三方网络请求 http

第一步:安装 http

参考:https://pub.flutter-io.cn/packages/http

http: ^0.12.2

在pubspec.yaml中配置保存后,记得put get~

Get 请求

void getRequest() async {var client = http.Client();http.Response response = await client.get(url_2);_content = response.body;}

Post 请求

  void postRequest() async {var params = Map<String, String>();params["username"] = "hellonews";params["password"] = "123456";var client = http.Client();var response = await client.post(url_post, body: params);_content = response.body;}

其实说了这么多作用不大,毕竟开发追求的效率

之间上压轴好戏!!!

3.dio请求

官网最新版和文档:https://pub.flutter-io.cn/packages/dio

dependencies:dio: ^4.0.0

咱们先来一个简单的例子

import 'package:dio/dio.dart';void main() async {var dio = Dio();final response = await dio.get('https://www.baidu.com');print(response.data);
}

这样肯定是不符合我们的开发日常需求的

我们来进行封装

dio的封装:

记得自己把包导入啊!!!,本节使用的是4.0.0的dio版本~

const int _connectTimeout = 15000; //15s
const int _receiveTimeout = 15000;
const int _sendTimeout = 10000;typedef Success<T> = Function(T data);
typedef Fail = Function(int code, String msg);
class DioUtils {// default optionsstatic const String TOKEN = '';static Dio _dio;// 创建 dio 实例对象static Dio createInstance() {if (_dio == null) {/// 全局属性:请求前缀、连接超时时间、响应超时时间var options = BaseOptions(/// 请求的Content-Type,默认值是"application/json; charset=utf-8"./// 如果您想以"application/x-www-form-urlencoded"格式编码请求数据,/// 可以设置此选项为 `Headers.formUrlEncodedContentType`,  这样[Dio]就会自动编码请求体.
//        contentType: Headers.formUrlEncodedContentType, // 适用于post form表单提交responseType: ResponseType.json,validateStatus: (status) {// 不使用http状态码判断状态,使用AdapterInterceptor来处理(适用于标准REST风格)return true;},baseUrl: APIs.apiPrefix,
//        headers: httpHeaders,connectTimeout: _connectTimeout,receiveTimeout: _receiveTimeout,sendTimeout: _sendTimeout,);_dio = new Dio(options);}return _dio;}// 清空 dio 对象static clear() {_dio = null;}// 请求,返回参数为 T// method:请求方法,Method.POST等// path:请求地址// params:请求参数// success:请求成功回调// error:请求失败回调static Future request<T>(Method method, String path, dynamic params,{Success success, Fail fail}) async {try {//没有网络var connectivityResult = await (new Connectivity().checkConnectivity());if (connectivityResult == ConnectivityResult.none) {_onError(ExceptionHandle.net_error, '网络异常,请检查你的网络!', fail);return;}Dio _dio = createInstance();Response response = await _dio.request(path,data: params, options: Options(method: MethodValues[method]));if (response != null) {if (success != null) {success(response.data);}} else {_onError(ExceptionHandle.unknown_error, '未知错误', fail);}} on DioError catch (e) {//      LogUtils.print_('请求出错:' + e.toString());final NetError netError = ExceptionHandle.handleException(e);_onError(netError.code, netError.msg, fail);}}
}/// 自定义Header
Map<String, dynamic> httpHeaders = {'Accept': 'application/json,*/*','Content-Type': 'application/json','token': DioUtils.TOKEN
};void _onError(int code, String msg, Fail fail) {if (code == null) {code = ExceptionHandle.unknown_error;msg = '未知异常';}LogUtils.print_('接口请求异常: code: $code, msg: $msg');if (fail != null) {fail(code, msg);}
}Map<String, dynamic> parseData(String data) {return json.decode(data) as Map<String, dynamic>;
}enum Method { GET, POST, DELETE, PUT, PATCH, HEAD }
//使用:MethodValues[Method.POST]
const MethodValues = {Method.GET: "get",Method.POST: "post",Method.DELETE: "delete",Method.PUT: "put",Method.PATCH: "patch",Method.HEAD: "head",
};

网络异常处理:

import 'dart:io';import 'package:dio/dio.dart';class ExceptionHandle {static const int success = 200;static const int success_not_content = 204;static const int unauthorized = 401;static const int forbidden = 403;static const int not_found = 404;static const int net_error = 1000;static const int parse_error = 1001;static const int socket_error = 1002;static const int http_error = 1003;static const int timeout_error = 1004;static const int cancel_error = 1005;static const int unknown_error = 9999;static NetError handleException(DioError error) {if (error is DioError) {if (error.type == DioErrorType.DEFAULT ||error.type == DioErrorType.RESPONSE) {dynamic e = error.error;if (e is SocketException) {return NetError(socket_error, '网络异常,请检查你的网络!');}if (e is HttpException) {return NetError(http_error, '服务器异常!');}if (e is FormatException) {return NetError(parse_error, '数据解析错误!');}return NetError(net_error, '网络异常,请检查你的网络!');} else if (error.type == DioErrorType.CONNECT_TIMEOUT ||error.type == DioErrorType.SEND_TIMEOUT ||error.type == DioErrorType.RECEIVE_TIMEOUT) {//  连接超时 || 请求超时 || 响应超时return NetError(timeout_error, '连接超时!');} else if (error.type == DioErrorType.CANCEL) {return NetError(cancel_error, '取消请求');} else {return NetError(unknown_error, '未知异常');}} else {return NetError(unknown_error, '未知异常');}}}class NetError {int code;String msg;NetError(this.code, this.msg);
}

完成啦,有疑问的话请添加我的练习方式哦~

欢迎留言纠正 ~ 不妨给个点赞哈哈

我是阿T一个幽默的程序员 我们下期再见~

添加我为你的好友,领取源码以及Flutter学习资料~

加入我们吧,一起学习,一起进步~

多种网络请求方式 ,这么骚气的操作确定不来看看嘛?相关推荐

  1. android 请求方式有哪些,Android中的几种网络请求方式详解

    Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面整理四种常用网络请求方式. java.net包中的HttpURLConnection类 Get方式: // Get方式请求 ...

  2. 超简单-用协程简化你的网络请求吧,兼容你的老项目和旧的网络请求方式

    前言 在Kotlin协程(后简称协程)出来之后,颠覆了我们很多工具类的封装方式,大大简化了我们很多api的调用,并且使异步操作逻辑更清晰了 其中一个很标志性的地方就属网络请求了,以前的网络请求方式声明 ...

  3. ajax jq 图片上传请求头_全面分析前端的网络请求方式:Ajax ,jQuery ,axios,fetch

    链接:https://juejin.im/post/5c9ac607f265da6103588b31 一.前端进行网络请求的关注点 大多数情况下,在前端发起一个网络请求我们只需关注下面几点: 传入基本 ...

  4. 6748如何设置edma为事件触发方式_全面分析前端的网络请求方式

    作者|ConardLi 编辑|覃云 来源|code 秘密花园公众号 一.前端进行网络请求的关注点 大多数情况下,在前端发起一个网络请求我们只需关注下面几点: 传入基本参数(url,请求方式) 请求参数 ...

  5. Flutter网络请求方式总结

    转载于:https://www.jianshu.com/p/59fc5ed37453 前言 编写一个 App,最离不开的就是网络请求了.在Android 原生中,网络请求库一直在更新,网络请求库甚多: ...

  6. 全面分析前端的网络请求方式

    一.前端进行网络请求的关注点 大多数情况下,在前端发起一个网络请求我们只需关注下面几点: 传入基本参数(url,请求方式) 请求参数.请求参数类型 设置请求头 获取响应的方式 获取响应头.响应状态.响 ...

  7. unity3d 切换网络_Unity3d新网络请求方式UnityWebRequest详解

    Unity将要逐步放弃www网络请求api,新的api请求方式来临:UnityWebRequestThe,也正是本篇文章要给大家介绍的重点,那就是UnityWebRequestThe的使用详解. 旧的 ...

  8. 轻松搞定Retrofit不同网络请求方式的请求参数配置,及常用注解使用

    <一>四种请求方式: GET 向服务器发起数据请求,获取信息.类似于数据库的select操作,只是查询,不会影响资源的内容. POST 向服务器发送数据,该请求会改变数据的种类等资源.类似 ...

  9. js 所有的网络请求方式

    文章目录 HTTP 请求报文 响应报文 常见的状态码 readyState 属性 原生AJAX AJAX 简介 XML 简介 AJAX 的特点 AJAX 的使用 解决 IE 缓存问题 ajax返回的状 ...

  10. android studio 接口方法,Android Studio第三十期 - 介绍几种网络请求方式写法

    框架git地址:附(爱一个人就要爱他(loader)的全部~) 请求方式:POST 请求示例{ "verify_info":{ "app":{ "ap ...

最新文章

  1. 数据管理、数据治理、数据管控的概念区别和范围是什么?
  2. python软件怎么使用-Python快速入门—如何选择使用包管理工具?
  3. python绘制直方图-python plotly绘制直方图实例详解
  4. Excel获得焦点变色
  5. c语言第1章ppt,c语言第1章课件.ppt
  6. Java的TheadLocal使用
  7. 分享15款为开发人员准备的开发移动应用程序必备的新资源和工具
  8. IEnumerable 使用foreach 详解
  9. P7408-[JOI 2021 Final]ダンジョン 3【贪心,树状数组】
  10. 上海特斯拉自燃事件终于有结果了:没有系统缺陷 单个电池模组故障
  11. Android sqlite数据库操作通用框架AHibernate(一)-CRUD示例和使用步骤
  12. 让网络不再瘫痪 ARP病毒的解决措施
  13. 西部数据暂停与华为的合作关系及发货
  14. 100项PPT制作技术
  15. Linux nohup命令详解
  16. java ppt转图片,怎么用POI将PPT的内容转换为图片
  17. 计算机多媒体技术操作题,计算机多媒体技术操作题.doc
  18. oracle中导出查询结果,Oracle SQL 查询结果导出到文本或Excel文件方法
  19. Failed to connect to server(code:1006)
  20. 【基于MATLAB的火灾疏散模拟仿真】——安全隐患提前发现,疏散方案优化

热门文章

  1. GitHub上万星:超精细的漫画上色AI,老婆画风任你选择,登上了趋势榜
  2. 本人大三准备写计算机安全毕业设计求想法
  3. MySQL Workbench建表时的PK,NN,UQ,B,UN,ZF,AI,G
  4. Ubuntu20.04的一些功能设置记录(持续更新)
  5. 微信屏蔽网址解决办法:实现被微信屏蔽的网址在微信内正常访问
  6. 网络安全笔记-18-ICMP 协议
  7. PPT | 5G时代的视频云服务关键技术与实践
  8. Redis一问多答(必背篇)
  9. 开发者投稿—百度大脑新品体验之肤色检测
  10. 拼多多顶级佣金助手-微信群自动发单