Flutter中的http网络请求

这篇具有很好参考价值的文章主要介绍了Flutter中的http网络请求。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

}

以上代码中httpClient.getUrl(uri)方法即是根据uri发起get请求,post请求用法和get请求只是调用方法不同,包括参数设置等其他用法都一样。请求抓包结果如下:

  • get请求
    fluhttp,程序员,flutter,http,网络协议
  • post请求
    fluhttp,程序员,flutter,http,网络协议
    请求成功之后以上代码输出结果如下:

I/flutter (19183): 请求成功
I/flutter (19183): responseBody={“resultcode”:“200”,“reason”:“查询成功”,“result”:{“sk”:{“temp”:“8”,“wind_direction”:“西南风”,“wind_strength”:“2级”,“humidity”:“51%”,“time”:“21:54”},“today”:{“temperature”:“1℃15℃",“weather”:“晴”,“weather_id”:{“fa”:“00”,“fb”:“00”},“wind”:“南风微风”,“week”:“星期五”,“city”:“北京”,“date_y”:“2019年03月01日”,“dressing_index”:“较冷”,“dressing_advice”:“建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。”,“uv_index”:“中等”,“comfort_index”:“”,“wash_index”:“较适宜”,“travel_index”:“较不宜”,“exercise_index”:“较不宜”,“drying_index”:“”},“future”:[{“temperature”:"1℃15℃”,“weather”:“晴”,“weather_id”:{“fa”:“00”,“fb”:“00”},“wind”:“南风微风”,“week”:“星期五”,“date”:“20190301”},{“temperature”:“3℃15℃",“weather”:“霾”,“weather_id”:{“fa”:“53”,“fb”:“53”},“wind”:“西南风微风”,“week”:“星期六”,“date”:“20190302”},{“temperature”:"3℃15℃”,“weather”:“霾转晴”,“weather_id”:{“fa”:“53”,“fb”:“00”},“wind”:“西南风微风”,"

由此可以看出结果输出不完整,部分字符串被丢弃了,前段时间有个同学留言问过这个问题,在这里说明一下。Flutter官方文档有这个问题的说明:

The Dart print() function outputs to the system console, which you can view using flutter logs (which is basically a wrapper around adb logcat).

If you output too much at once, then Android sometimes discards some log lines. To avoid this, you can use debugPrint(), from Flutter’s foundation library. This is a wrapper around print which throttles the output to a level that avoids being dropped by Android’s kernel.

具体地址在:

https://flutter.dev/docs/testing/debugging#print-and-debugprint-with-flutter-logs

官方建议我们输出日志过多的时候使用debugPrint()函数,作者使用debugPrint()函数之后发现依然是输出不完整,查看debugPrint()函数的具体代码实现后发现以上输出的内容是一行的内容,一行内容过多的情况下debugPrint()函数依然无法完整进行输出,最后我采用了一个技巧,对以上返回的responseBody结果进行了简单处理,根据特殊字符串进行字符串替换,加入换行符,代码如下:

var responseBody = await response.transform(utf8.decoder).join();
//‘{’符号前加个换行符
responseBody = responseBody.replaceAll(“{”, “\n{”);
debugPrint(‘responseBody=$responseBody’);

于是输出了完整的请求返回结果:

I/flutter (19183): 请求成功
I/flutter (19183): responseBody=
I/flutter (19183): {“resultcode”:“200”,“reason”:“successed!”,“result”:
I/flutter (19183): {“sk”:
I/flutter (19183): {“temp”:“8”,“wind_direction”:“西南风”,“wind_strength”:“2级”,“humidity”:“51%”,“time”:“22:09”},“today”:
I/flutter (19183): {“temperature”:“1℃~15℃”,“weather”:“晴”,“weather_id”:
I/flutter (19183): {“fa”:“00”,“fb”:“00”},“wind”:“南风微风”,“week”:“星期五”,“city”:“北京”,“date_y”:“2019年03月01日”,“dressing_index”:“较冷”,“dressing_advice”:“建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。”,“uv_index”:“中等”,“comfort_index”:“”,“wash_index”:“较适宜”,“travel_index”:“较不宜”,“exercise_index”:“较不宜”,“drying_index”:“”},“future”:[
I/flutter (19183): {“temperature”:“1℃~15℃”,“weather”:“晴”,“weather_id”:
I/flutter (19183): {“fa”:“00”,“fb”:“00”},“wind”:“南风微风”,“week”:“星期五”,“date”:“20190301”},
I/flutter (19183): {“temperature”:“3℃~15℃”,“weather”:“霾”,“weather_id”:
I/flutter (19183): {“fa”:“53”,“fb”:“53”},“wind”:“西南风微风”,“week”:“星期六”,“date”:“20190302”},
I/flutter (19183): {“temperature”:“3℃~15℃”,“weather”:“霾转晴”,“weather_id”:
I/flutter (19183): {“fa”:“53”,“fb”:“00”},“wind”:“西南风微风”,“week”:“星期日”,“date”:“20190303”},
I/flutter (19183): {“temperature”:“2℃~15℃”,“weather”:“晴”,“weather_id”:
I/flutter (19183): {“fa”:“00”,“fb”:“00”},“wind”:“北风微风”,“week”:“星期一”,“date”:“20190304”},
I/flutter (19183): {“temperature”:“3℃~16℃”,“weather”:“晴”,“weather_id”:
I/flutter (19183): {“fa”:“00”,“fb”:“00”},“wind”:“北风微风”,“week”:“星期二”,“date”:“20190305”},
I/flutter (19183): {“temperature”:“3℃~15℃”,“weather”:“霾”,“weather_id”:
I/flutter (19183): {“fa”:“53”,“fb”:“53”},“wind”:“西南风微风”,“week”:“星期三”,“date”:“20190306”},
I/flutter (19183): {“temperature”:“3℃~15℃”,“weather”:“霾”,“weather_id”:
I/flutter (19183): {“fa”:“53”,“fb”:“53”},“wind”:“西南风微风”,“week”:“星期四”,“date”:“20190307”}]},“error_code”:0}

第三方网络库dio

dio是目前使用最多的Flutter三方网络库,它是对http请求的一个封装,功能非常强大,支持拦截器、全局配置、表单数据、请求取消、文件下载、超时等。目前dio的最新版本为2.0.15,2.x版本对1.x版本代码进行了一些重构,所以之前使用过1.x版本的同学,再升级到2.x时要注意需要修改一些代码。

下面基于2.0.15版本举个请求天气信息的例子:

Future _getWeatherInfo() async {
Dio dio = Dio();
//设置代理
DefaultHttpClientAdapter adapter = dio.httpClientAdapter;
adapter.onHttpClientCreate = (HttpClient client) {
if(client == null) {
client = HttpClient();
}
client.findProxy = (url) {
return HttpClient.findProxyFromEnvironment(url, environment: {“http_proxy”: ‘http://192.168.124.94:8888’,});
};
return client;
};
dio.options.baseUrl = “http://v.juhe.cn/”;
//设置连接超时时间
dio.options.connectTimeout = 10000;
//设置数据接收超时时间
dio.options.receiveTimeout = 10000;
try {
//以表单的形式设置请求参数
Map<String, String> queryParameters = {‘format’: ‘2’, ‘key’: ‘939e592487c33b12c509f757500888b5’, ‘lon’: ‘116.39277’, ‘lat’: ‘39.933748’};
Response response = await dio.get(“/weather/geo”, queryParameters: queryParameters);
if (response.statusCode == 200) {
print(‘请求成功’);
var responseData = response.data.toString();
responseData = responseData.replaceAll(“{”, “\n{”);
debugPrint(‘response.data=$responseData’);
}
} on DioError catch (e) {
print(“exception: $e”);
}

return;
}

关于代理设置代码块,在Dio 2.x版本和1.x版本上设置的方式是不同的,这是因为Dio 2.x版本代码重构的原因,1.x代码上onHttpClientCreate方法放在了Dio类中,而2.x版本将该方法封装到了一个名为DefaultHttpClientAdapter的类中,Dio类中的httpClientAdapter即是默认实现了DefaultHttpClientAdapter类的对象,所以此时根据httpClientAdapter对象来设置onHttpClientCreate为自定义方法即可。

1.x版本代理设置方法的代码块如下:

Dio dio = Dio();
dio.onHttpClientCreate = (HttpClient client) {
if(client == null) {
client = HttpClient();
}
client.findProxy = (url) {
return HttpClient.findProxyFromEnvironment(url, environment: {“http_proxy”: ‘http://192.168.124.94:8888’,});
};
return client;
};

拦截器

使用Dio处理网络请求可以设置拦截器,dio中定义了两个拦截器:LogInterceptor和CookieManager,这两个拦截器都是抽象类Interceptor的实现,具体是对抽象类中onRequest、onResponse、onError三个方法的实现,我们也可以自定义拦截器处理一些自己的需求。下面使用LogInterceptor来举例说明拦截器的作用:

//在上文dio使用的代码中加入如下代码,即添加了Log拦截器
dio.interceptors.add(LogInterceptor());

添加拦截器之后,执行请求,会看到控制台打印如下信息:

I/flutter (28939): *** Request ***
I/flutter (28939): uri: http://v.juhe.cn/weather/geo?format=2&key=939e592487c33b12c509f757500888b5&lon=116.39277&lat=39.933748
I/flutter (28939): method: GET
I/flutter (28939): contentType: application/json; charset=utf-8
I/flutter (28939): responseType: ResponseType.json
I/flutter (28939): followRedirects: true
I/flutter (28939): connectTimeout: 10000
I/flutter (28939): receiveTimeout: 10000
I/flutter (28939): extra: {}
I/flutter (28939): header:
I/flutter (28939):
I/flutter (28939): *** Response ***
I/flutter (28939): uri: http://v.juhe.cn/weather/geo?format=2&key=939e592487c33b12c509f757500888b5&lon=116.39277&lat=39.933748
I/flutter (28939): statusCode: 200
I/flutter (28939): headers:
I/flutter (28939): proxy-connection: Keep-alive
I/flutter (28939): etag: 063d270dc44003f39cf480b7ec6ff843
I/flutter (28939): content-type: application/json;charset=utf-8
I/flutter (28939): set-cookie: aliyungf_tc=AQAAAP85/D47jwIAsongemk2vUOG/ZUW; Path=/; HttpOnly
I/flutter (28939): transfer-encoding: chunked
I/flutter (28939): date: Sat, 02 Mar 2019 04:29:17 GMT
I/flutter (28939):
I/flutter (28939):

由打印结果可以看出LogInterceptor拦截器其实就是对request和response相关信息的打印,这有助于我们对http请求进行调试。

全局配置

由以上代码可以看出使用dio实现网络请求时,可以通过dio.options的进行全局通用配置,比如baseUrl、超时时间、请求的header信息等。

表单数据

使用post请求我们可以使用form表单的形式发送参数数据,代码如下:

Map<String, String> queryParameters = {‘format’: ‘2’, ‘key’: ‘939e592487c33b12c509f757500888b5’, ‘lon’: ‘116.39277’, ‘lat’: ‘39.933748’};
Response response = await dio.post(“/weather/geo”, data: FormData.from(queryParameters), options: Options());

通过抓取请求包,我们会发现content-type类型如下:
fluhttp,程序员,flutter,http,网络协议

请求取消

比如跳转到某个页面请求了一条远程数据,但在数据没有回来之前关闭了该页面,那这条请求是可以在关闭页面时取消掉的,这要求你在发请求时使用cancelToken参数,如下:

CancelToken _cancelToken = CancelToken();
Map<String, String> queryParameters = {‘format’: ‘2’, ‘key’: ‘939e592487c33b12c509f757500888b5’, ‘lon’: ‘116.39277’, ‘lat’: ‘39.933748’};
Response response = await dio.post(“/weather/geo”, data: FormData.from(queryParameters), cancelToken: _cancelToken);

在页面退出之前可以通过调用_cancelToken.cancel()方法取消该请求。多个请求可以使用同一个CancelToken对象,故调用该对象的cancel()方法时所有的未完成的请求均会被取消。

文件下载

Dio中实现的文件下载功能也非常简单好用,实例代码如下:

Future getSavePath() async {
Directory externalStorageDir = await getExternalStorageDirectory();
String externalStoragePath = externalStorageDir.path + “/flutterdemo”;
Directory dir = Directory(externalStoragePath);
if(!dir.existsSync()) {
dir.createSync();
}
File file = File(dir.path + “/test.jpg”);
if(!file.existsSync()) {
file.createSync();
}
print(‘file.path = ${file.path}’);
return file.path;
}

Future _downloadImage() async {
Dio dio = Dio();
dio.options.baseUrl = “http://img.ipintu.cn/images/”;
dio.interceptors.add(LogInterceptor());
String savePath = await getSavePath();
try {
Response response = await dio.download(
“/baomanwayong_04.jpg”,
savePath,
onReceiveProgress: (int count, int total) {
if(total > 0) {
print((count / total * 100).toStringAsFixed(0) + “%”);
}
});
if (response.statusCode == 200) {
print(‘下载完成’);
}
} on DioError catch (e) {
print(“exception: $e”);
}

return;
}

点击按钮调用下载方法,控制台输出信息如下:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

fluhttp,程序员,flutter,http,网络协议

fluhttp,程序员,flutter,http,网络协议

fluhttp,程序员,flutter,http,网络协议

fluhttp,程序员,flutter,http,网络协议

fluhttp,程序员,flutter,http,网络协议

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

fluhttp,程序员,flutter,http,网络协议

最后

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

fluhttp,程序员,flutter,http,网络协议

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
  • 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!文章来源地址https://www.toymoban.com/news/detail-853781.html

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
  • 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

到了这里,关于Flutter中的http网络请求的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据分析在程序员职业中的重要性及实践应用

    在当今信息化社会的快速发展中,数据分析已经成为一项重要的职业技能。不论是从事哪个行业,都需要具备一定的数据分析能力。对于程序员而言,掌握数据分析技能不仅能够提升自身在职场中的竞争力,更能够在职业生涯中获得更多的发展机会。本文将围绕数据分析在程

    2024年02月07日
    浏览(53)
  • 程序员的周末——硬件设计中的Hello World__STM32核心板绘制

    目录 1 原理图库的创建 1.1 原理图库创建过程中用到的操作或者快捷键 2 PCB封装库的创建 2.1 PCB封装库创建过程中用到的操作或者快捷键 3 原理图设计​​​​​​​ 3.1 原理图设计过程中使用到的功能菜单或者快捷键记录 4 PCB元器件布局 4.1 布局之后完整的PCB 4.2 PCB布局过程中

    2024年01月20日
    浏览(98)
  • 高薪程序员&面试题精讲系列141之如何管理项目中的日志?如何查看线上日志?

    项目日志有哪些级别? 项目日志具体怎么打印? 如何管理项目中的日志? 你用过哪些日志框架? 你了解ELK吗? 项目上线后怎么查看报错日志? 我们在进行项目开发时,除了进行编码实现业务功能之外,还要进行各种辅助的工作,比如要统计日志、项目运行、运营等各种信息

    2024年02月02日
    浏览(66)
  • 1024程序员狂欢节 | IT前沿技术、人工智能、数据挖掘、网络空间安全技术

    一年一度的1024程序员狂欢节又到啦!成为更卓越的自己,坚持阅读和学习,别给自己留遗憾,行动起来吧! 那么,都有哪些好书值得入手呢?小编为大家整理了前沿技术、人工智能、集成电路科学与芯片技术、新一代信息与通信技术、网络空间安全技术,四大热点领域近期

    2024年02月06日
    浏览(67)
  • 1024程序员狂欢节有好礼 | 前沿技术、人工智能、集成电路科学与芯片技术、新一代信息与通信技术、网络空间安全技术

    🌹欢迎来到 爱书不爱输的程序猿 的博客, 本博客致力于知识分享,与更多的人进行学习交流 🚩🚩🚩 点击直达福利 一年一度的1024程序员狂欢节又到啦!成为更卓越的自己,坚持阅读和学习,别给自己留遗憾,行动起来吧! 那么,都有哪些好书值得入手呢?小编为大家整理

    2024年02月08日
    浏览(79)
  • [小程序]Http网络请求

            出于安全性(bushi)考虑,小程序请求的数据接口必须具备以下两个条件:         ①只能请求Https类型         ②必须将接口域名添加到信任列表中         配置步骤如下: 小程序管理后台 - 开发 - 开发设置 - 服务器域名 - 修改request合法域名         调用wx.reques

    2024年01月22日
    浏览(37)
  • 程序员简历程序员简历.pdf

    你们在制作简历时,是不是基本只关注两件事: 简历模板,还有基本信息的填写 。 当你再次坐下来更新你的简历时,可能会发现自己不自觉地选择了那个“ 看起来最好看的模板 ”,填写基本信息,却没有深入思考如何使简历更具吸引力。这其实是一个普遍现象: 许多求职

    2024年04月14日
    浏览(52)
  • 普通程序员和厉害程序员的差距!

    大家好,我是 程序员陶朱公 。 今天跟大家聊一下关于代码重构的话题。 话说,很多程序员对自己写的代码平时很随心所欲(各种魔法变量,一个方法几十上百行代码,还有各种让人崩溃的变量或方法命名)。 当有一天让他维护他人的代码,他就会抓狂,很容易激发他体内重构

    2024年03月23日
    浏览(67)
  • AI程序员对程序员的影响

    最近,全球首位AI程序员Devin的出现引发了广泛关注,也引发了人们对人工智能在编程领域的潜力和影响的讨论。尽管AI技术在编程领域得到广泛应用,但人们仍然在探讨它是否能完全取代人类程序员。本文将探讨AI程序员的优势、局限性以及对程序员职业的影响,并展望未来

    2024年03月23日
    浏览(61)
  • 大批程序员失业,大龄程序员出路在哪里?

    在程序员这个群体中,时常有人陷入技术迷信和思维僵化的困境,但实际上,当前市场对于技术的需求是非常广泛的。因此,我提出了一些建议,希望能够帮助程序员跳出技术框架,更好地利用技能创造实际价值。以下是一些建议供参考: 开发小而实用的工具类软件: 以“

    2024年01月22日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包