多种网络请求方式 ,这么骚气的操作确定不来看看嘛?
前言:
兄弟们,网络真是个好东西,里面去个个都是人才,说话又好听,超喜欢在里面。
确实,网络已经是我们日常生活中密不可分的一部分了
那咱们今天就来讲讲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学习资料~
加入我们吧,一起学习,一起进步~
多种网络请求方式 ,这么骚气的操作确定不来看看嘛?相关推荐
- android 请求方式有哪些,Android中的几种网络请求方式详解
Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面整理四种常用网络请求方式. java.net包中的HttpURLConnection类 Get方式: // Get方式请求 ...
- 超简单-用协程简化你的网络请求吧,兼容你的老项目和旧的网络请求方式
前言 在Kotlin协程(后简称协程)出来之后,颠覆了我们很多工具类的封装方式,大大简化了我们很多api的调用,并且使异步操作逻辑更清晰了 其中一个很标志性的地方就属网络请求了,以前的网络请求方式声明 ...
- ajax jq 图片上传请求头_全面分析前端的网络请求方式:Ajax ,jQuery ,axios,fetch
链接:https://juejin.im/post/5c9ac607f265da6103588b31 一.前端进行网络请求的关注点 大多数情况下,在前端发起一个网络请求我们只需关注下面几点: 传入基本 ...
- 6748如何设置edma为事件触发方式_全面分析前端的网络请求方式
作者|ConardLi 编辑|覃云 来源|code 秘密花园公众号 一.前端进行网络请求的关注点 大多数情况下,在前端发起一个网络请求我们只需关注下面几点: 传入基本参数(url,请求方式) 请求参数 ...
- Flutter网络请求方式总结
转载于:https://www.jianshu.com/p/59fc5ed37453 前言 编写一个 App,最离不开的就是网络请求了.在Android 原生中,网络请求库一直在更新,网络请求库甚多: ...
- 全面分析前端的网络请求方式
一.前端进行网络请求的关注点 大多数情况下,在前端发起一个网络请求我们只需关注下面几点: 传入基本参数(url,请求方式) 请求参数.请求参数类型 设置请求头 获取响应的方式 获取响应头.响应状态.响 ...
- unity3d 切换网络_Unity3d新网络请求方式UnityWebRequest详解
Unity将要逐步放弃www网络请求api,新的api请求方式来临:UnityWebRequestThe,也正是本篇文章要给大家介绍的重点,那就是UnityWebRequestThe的使用详解. 旧的 ...
- 轻松搞定Retrofit不同网络请求方式的请求参数配置,及常用注解使用
<一>四种请求方式: GET 向服务器发起数据请求,获取信息.类似于数据库的select操作,只是查询,不会影响资源的内容. POST 向服务器发送数据,该请求会改变数据的种类等资源.类似 ...
- js 所有的网络请求方式
文章目录 HTTP 请求报文 响应报文 常见的状态码 readyState 属性 原生AJAX AJAX 简介 XML 简介 AJAX 的特点 AJAX 的使用 解决 IE 缓存问题 ajax返回的状 ...
- android studio 接口方法,Android Studio第三十期 - 介绍几种网络请求方式写法
框架git地址:附(爱一个人就要爱他(loader)的全部~) 请求方式:POST 请求示例{ "verify_info":{ "app":{ "ap ...
最新文章
- 数据管理、数据治理、数据管控的概念区别和范围是什么?
- python软件怎么使用-Python快速入门—如何选择使用包管理工具?
- python绘制直方图-python plotly绘制直方图实例详解
- Excel获得焦点变色
- c语言第1章ppt,c语言第1章课件.ppt
- Java的TheadLocal使用
- 分享15款为开发人员准备的开发移动应用程序必备的新资源和工具
- IEnumerable 使用foreach 详解
- P7408-[JOI 2021 Final]ダンジョン 3【贪心,树状数组】
- 上海特斯拉自燃事件终于有结果了:没有系统缺陷 单个电池模组故障
- Android sqlite数据库操作通用框架AHibernate(一)-CRUD示例和使用步骤
- 让网络不再瘫痪 ARP病毒的解决措施
- 西部数据暂停与华为的合作关系及发货
- 100项PPT制作技术
- Linux nohup命令详解
- java ppt转图片,怎么用POI将PPT的内容转换为图片
- 计算机多媒体技术操作题,计算机多媒体技术操作题.doc
- oracle中导出查询结果,Oracle SQL 查询结果导出到文本或Excel文件方法
- Failed to connect to server(code:1006)
- 【基于MATLAB的火灾疏散模拟仿真】——安全隐患提前发现,疏散方案优化
热门文章
- GitHub上万星:超精细的漫画上色AI,老婆画风任你选择,登上了趋势榜
- 本人大三准备写计算机安全毕业设计求想法
- MySQL Workbench建表时的PK,NN,UQ,B,UN,ZF,AI,G
- Ubuntu20.04的一些功能设置记录(持续更新)
- 微信屏蔽网址解决办法:实现被微信屏蔽的网址在微信内正常访问
- 网络安全笔记-18-ICMP 协议
- PPT | 5G时代的视频云服务关键技术与实践
- Redis一问多答(必背篇)
- 开发者投稿—百度大脑新品体验之肤色检测
- 拼多多顶级佣金助手-微信群自动发单