Flutter网络请求方式总结
转载于:https://www.jianshu.com/p/59fc5ed37453
前言
编写一个 App,最离不开的就是网络请求了。在Android 原生中,网络请求库一直在更新,网络请求库甚多:HttpUrlConnection、HttpClient、Volley、Okhttp、Retrofit...
Flutter 才出来没多久,普及率也不是很高,网络请求大致分为三种方式:
- Dart 原生的网络请求
HttpClient
- 库
http
- Flutter中文网发布的
dio
本文分别介绍这三种网络请求方式的 GET
和 POST
。
一、原生方式
1.1 get 请求
先上代码:
void getNet_1() async {var client = new HttpClient();var request = await client.getUrl(Uri.parse(url_1));var response = await request.close();if (response.statusCode == HttpStatus.ok) {_content = await response.transform(Utf8Decoder()).join();}}
async
和await
表示异步需要引入的包:
import 'dart:convert';
import 'dart:io';
pubspec.yaml
文件不需要修改
Dart 语言出来的时间比较晚,吸收了前辈语言们的经验,Java 的原生网络请求代码可是一大截,Dart 语言的简简单单的几行,非常现代化。
1.2 post 请求
原生的网络请求虽然有 post 方法,但是对 post 请求支持不是很友好,在网上找了很久也没找到案例,最后在 stackoverflow 上找到一篇文章:
https://stackoverflow.com/questions/21491543/how-to-do-post-in-dart-command-line-httpclient
还是用其他的网络请求方式-_-||
二、库 http
2.1 get 请求
代码如下:
void getNet_2() async {var client = http.Client();http.Response response = await client.get(url_2);_content = response.body;}
- 代码量比原生的简洁很多,然而还可以更简洁
void getNet_2_easy() {http.Client().get(url_2).then((http.Response response) {_content = response.body;});}
- 导包:
import 'package:http/http.dart' as http;
pubspec.yaml
以前要添加依赖,现在不要了,如果需要如下:
http: '>=0.11.3+12'
2.2 post 请求
void postNet_2() 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;}
这代码量跟 Java 相比,简直不要太爽。
最开始这里我遇到一个坑,我是这么写的:
http.post(url, body: JSON.encode({'username': 'hellonews','password':'123456'}))
返回的数据死活说账号密码错误,后面发现是表单提交。。。-_-||
http
的 post
源码中有这个一个注释:
If [body] is a Map, it's encoded as form fields using [encoding]. The
content-type of the request will be set to
"application/x-www-form-urlencoded"
;
意思大概是:如果你 post
上来的 body
是一个 Map
,它会自动转换成表单提交。
我在 dio
中使用这个 Map
却死活说账号密码错误, 最后发现 dio
表单使用另一种方式。
三、库 dio
3.1 get 请求
代码如下:
void getNet_3() async {Dio dio = new Dio();var response = await dio.get(url_3);_content = response.data.toString();}
pubspec.yaml
要添加依赖:
dependencies:······dio: ^1.0.9
- 导包:
import 'package:dio/dio.dart';
3.2 post 请求
void postNet_3() async {FormData formData = new FormData.from({"username": "hellonews","password": 123456,});var dio = new Dio();var response = await dio.post(url_post, data: formData);_content = response.data.toString();}
对比 dio
和 http
两个库,发现他们其实使用方式差不多,http
还不要加依赖,那我为什么要用dio
呢?
从 dio
的官方 Github 上 copy 它的介绍来回答这个问题:
dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时等...
非常明了吧,dio
其实就相当于现在 Android
流行的 Okhttp + Retrofit
。
所以我们为了省事,还是用 dio
吧。
完
- 本文 Github 地址如下:
https://github.com/ldlywt/flutter_demo - 本文 post 请求的接口调试来自鸿洋大神的
http://wanandroid.com/blog/show/2
Flutter网络请求方式总结相关推荐
- 6748如何设置edma为事件触发方式_全面分析前端的网络请求方式
作者|ConardLi 编辑|覃云 来源|code 秘密花园公众号 一.前端进行网络请求的关注点 大多数情况下,在前端发起一个网络请求我们只需关注下面几点: 传入基本参数(url,请求方式) 请求参数 ...
- Flutter 网络请求框架dio使用详解
前言 dio是一款Flutter 网络请求框架,在GitHub上目前有超过5.9k个star.由国人(Flutter中文网)开发,所以中文文档非常完善. 这里copy了dio官方的文档,便于自己开发时 ...
- android 请求方式有哪些,Android中的几种网络请求方式详解
Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面整理四种常用网络请求方式. java.net包中的HttpURLConnection类 Get方式: // Get方式请求 ...
- 超简单-用协程简化你的网络请求吧,兼容你的老项目和旧的网络请求方式
前言 在Kotlin协程(后简称协程)出来之后,颠覆了我们很多工具类的封装方式,大大简化了我们很多api的调用,并且使异步操作逻辑更清晰了 其中一个很标志性的地方就属网络请求了,以前的网络请求方式声明 ...
- ajax jq 图片上传请求头_全面分析前端的网络请求方式:Ajax ,jQuery ,axios,fetch
链接:https://juejin.im/post/5c9ac607f265da6103588b31 一.前端进行网络请求的关注点 大多数情况下,在前端发起一个网络请求我们只需关注下面几点: 传入基本 ...
- 全面分析前端的网络请求方式
一.前端进行网络请求的关注点 大多数情况下,在前端发起一个网络请求我们只需关注下面几点: 传入基本参数(url,请求方式) 请求参数.请求参数类型 设置请求头 获取响应的方式 获取响应头.响应状态.响 ...
- flutter网络请求dio的get、post、上传文件、下载文件总结
题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. 重要消息 flutter中网络请求dio使用分析 视频教程在这里 Flutter 从入门实践到开发一个APP之UI基础 ...
- Flutter网络请求库DIO入门文档(1),android开发网
}); response = await dio.post("http/test/upload", data: formData); //上传多个文件 formData = For ...
- Flutter网络请求库DIO入门文档,实战案例
var request = await httpClient.getUrl(Uri.parse(url)); var response = await request.close(); if (res ...
最新文章
- Resin介绍及其使用配置
- 用递归的方法求s = k! + n! / m!的值
- 25个Java机器学习工具库--转载
- [OS复习]进程管理3
- date时区 es logstash_es-日志存储-Logstash 介绍
- 四层负载均衡和七层负载均衡的区别
- 面试准备-Shell脚本
- 详解在ASP.NET中用LINQ实现数据处理
- 第一天:认识python
- 非常有名的免费开源图库相册软件
- python定义一个字符串后怎么修改_python基础--字符串操作详解
- python 邮件中生成图表_60秒一口Python:147个demo,助你从新手小白步步进阶编程高手...
- sublime text3 保存文件时候名字后缀.dump问题解决
- 易驾佳智能机器人教练_我市首个“机器人教练”上岗 驾校开启人工智能教学新模式...
- 【细节实现题】LeetCode 8. String to Integer (atoi)
- STM32F103 驱动DS18B20
- 高分三号卫星(GF-3)简介
- 基于 SpringBoot 和 webSocket 的匿名聊天室
- EMM系列1:EMM和ECM状态
- 分段函数的期望和方差_导数排列组合期望方差.doc