Flutter 核心技术与实战
陈航
前美团点评高级技术专家
42432 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
Flutter 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

24 | HTTP网络编程与JSON解析

compute函数
嵌套对象属性解析
解析类
手动解析
JSON格式
请求拦截器
并行请求
文件下载
文件上传
打印请求结果
设置URI及请求user-agent后发起请求
创建网络调用示例
打印请求结果
设置user-agent为"Custom-UA",随后立即发出请求
构造URI
创建网络调用示例
解码响应的内容
发起请求, 等待响应
构造URI,设置请求header、body
创建网络调用实例client
JSON解析
JSON结构化描述
dio
http
HttpClient
JSON解析
HTTP网络编程
参考文章

该思维导图由 AI 生成,仅供参考

你好,我是陈航。
在上一篇文章中,我带你一起学习了 Dart 中异步与并发的机制及实现原理。与其他语言类似,Dart 的异步是通过事件循环与队列实现的,我们可以使用 Future 来封装异步任务。而另一方面,尽管 Dart 是基于单线程模型的,但也提供了 Isolate 这样的“多线程”能力,这使得我们可以充分利用系统资源,在并发 Isolate 中搞定 CPU 密集型的任务,并通过消息机制通知主 Isolate 运行结果。
异步与并发的一个典型应用场景,就是网络编程。一个好的移动应用,不仅需要有良好的界面和易用的交互体验,也需要具备和外界进行信息交互的能力。而通过网络,信息隔离的客户端与服务端间可以建立一个双向的通信通道,从而实现资源访问、接口数据请求和提交、上传下载文件等操作。
为了便于我们快速实现基于网络通道的信息交换实时更新 App 数据,Flutter 也提供了一系列的网络编程类库和工具。因此在今天的分享中,我会通过一些小例子与你讲述在 Flutter 应用中,如何实现与服务端的数据交互,以及如何将交互响应的数据格式化。

Http 网络编程

我们在通过网络与服务端数据交互时,不可避免地需要用到三个概念:定位、传输与应用。
其中,定位,定义了如何准确地找到网络上的一台或者多台主机(即 IP 地址);传输,则主要负责在找到主机后如何高效且可靠地进行数据通信(即 TCP、UDP 协议);而应用,则负责识别双方通信的内容(即 HTTP 协议)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Flutter中实现HTTP网络编程与JSON解析是移动应用开发中的重要内容。本文介绍了在Flutter应用中实现与服务端的数据交互以及将交互响应的数据格式化的方法。首先,文章详细讲解了在Flutter中实现HTTP网络编程的三种方式:dart:io里的HttpClient实现、Dart原生http请求库实现以及第三方库dio实现,并提供了相应的代码示例和详细说明。此外,还介绍了dio库的高级特性,如请求取消、设置代理、证书校验等功能。另外,文章还分享了JSON解析的相关内容,包括手动解析的方法和处理复杂数据结构的技巧。总的来说,本文内容涵盖了Flutter中HTTP网络编程与JSON解析的实现方法和技巧,为读者提供了有益的参考。文章还提出了两道思考题,鼓励读者深入思考和实践。通过本文的阅读,读者可以快速了解Flutter中HTTP网络编程与JSON解析的方法,以及各种方式的优缺点,为实际应用提供了有益的参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Flutter 核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(27)

  • 最新
  • 精选
  • 和小胖
    第一个问题解决方法: dio.interceptors.add(InterceptorsWrapper( onRequest: (Options options) async { if (options.headers['token'] == null) { print("no token,request token firstly..."); //lock the dio. dio.lock(); return new Dio().get("http://xxxx.com/token").then((d) { options.headers["token"] = d.data['token']; print("request token succeed, value: " + d.data['token']); print( 'continue to perform request:path:${options.path},baseURL:${options.path}'); return options; }).whenComplete(() => dio.unlock()); // unlock the dio } return options; } ));

    作者回复: 厉害👍

    2019-10-09
    2
    18
  • 江宁彭于晏
    分享一个json转dart类的工具,理解了原理后,实际项目中可以省不少时间https://javiercbk.github.io/json_to_dart/

    作者回复: 赞👍

    2019-09-11
    12
  • 和小胖
    第二道题解决方法: class Student { String id; String name; int score; List<Teacher> teachers; Student({this.id, this.name, this.score, this.teachers}); factory Student.fromJson(Map<String, dynamic> parsedJson) { return Student( id: parsedJson['id'], name: parsedJson['name'], score: parsedJson['score'], teachers: getTeacher(parsedJson['teachers'])); } static List<Teacher> getTeacher(dynamic list) { List<Teacher> teachers = new List(); list.forEach((f) { teachers.add(Teacher.fromJson(f)); }); return teachers; } } class Teacher { String name; int age; Teacher({this.age, this.name}); factory Teacher.fromJson(Map<String, dynamic> parsedJson) { return Teacher(name: parsedJson['name'], age: parsedJson['age']); } }

    作者回复: 👍厉害

    2019-10-09
    2
    6
  • 给我点阳光就灿烂
    如何进行socket通信

    作者回复: 可以参考cnDart社区的文章:http://www.cndartlang.com/841.html

    2019-08-22
    2
    4
  • Geek_0793f1
    使用这种方式,我们需要先将 JSON 字符串传递给 JSON.decode 方法解析成一个 Map,然后把这个 Map 传给自定义的类,进行相关属性的赋值。 前端一般把json字符串解析成map之后,就直接用这个map进行相关的属性赋值了,老师能解释一下,传给自定义类的做法的好处吗?

    作者回复: 以对象的方式承接服务端返回的JSON字典,不仅更直观,也避免了一些因为key写错出现的代码错误。js的类型系统比较混乱,object和字典是可以混用的,比如下面这段代码: var x = {'number':123,'title':'title'}; x.number和x['number']是等价的,所以这也就是为什么前端同学直接拿字典就可以当对象用了。 而Dart是强类型语言,字典里的键值对和对象的属性是不能混用的,所以我们需要定义一层映射关系。

    2019-09-02
    2
    2
  • Geek_0d3a08
    重定向监听有吗?

    作者回复: Dio默认会自动帮你重定向,你可以在options参数里面把followRedirects置为false,自己在拦截器中处理重定向

    2019-08-29
    1
  • 江厚宏
    老师能不能介绍一下反序列化工具,比如json_serializable和 built_value,建议用哪一个,如果遇到泛型,该如何处理

    作者回复: 其实我觉得Dart提供的JSON自动序列化方案并不好用,所以我还是推荐手动解析,对于泛型,直接在运行是判断类型,走对应的解析方法就可以了。 看你的使用场景,一般而言,json_serializable易用性上比built_value会更好一些。

    2019-08-22
    1
  • 安南寸暖🤕
    json_model 怎么生成纯数组的解析代码?

    作者回复: 参考官方文档吧https://github.com/flutterchina/json_model

    2019-11-07
  • 大神博士
    想问下 Flutter 中 JSONP 的请求怎么处理

    作者回复: 1.直接发url请求就可以了、把服务端返回的数据当作字符串简单处理下,把它转成json格式 2.flutter不需要处理跨域问题,不建议用jsonp这种奇怪的格式

    2019-09-21
    2
  • 米米呀👧
    import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; [...] loadData() async { String dataURL = "https://jsonplaceholder.typicode.com/posts"; http.Response response = await http.get(dataURL); setState(() { widgets = JSON.decode(response.body); }); } } 官网Demo里面是用的这个,跟HttpClient有什么区别?我该用哪个?

    作者回复: 这个就是今天分享说的http包啊

    2019-09-10
收起评论
显示
设置
留言
27
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部