24 | HTTP网络编程与JSON解析
24 | HTTP网络编程与JSON解析
讲述:陈航
时长14:28大小13.24M
Http 网络编程
HttpClient
http
dio
JSON 解析
如何结构化地描述返回的通信信息?
如何解析格式化的信息?
总结
思考题
赞 2
提建议
精选留言(26)
- 和小胖2019-10-09第一个问题解决方法: 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; } ));展开
作者回复: 厉害👍
共 2 条评论15 - 江宁彭于晏2019-09-11分享一个json转dart类的工具,理解了原理后,实际项目中可以省不少时间https://javiercbk.github.io/json_to_dart/
作者回复: 赞👍
10 - 给我点阳光就灿烂2019-08-22如何进行socket通信
作者回复: 可以参考cnDart社区的文章:http://www.cndartlang.com/841.html
共 2 条评论4 - 和小胖2019-10-09第二道题解决方法: 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']); } }展开
作者回复: 👍厉害
共 2 条评论4 - Geek_0793f12019-09-02使用这种方式,我们需要先将 JSON 字符串传递给 JSON.decode 方法解析成一个 Map,然后把这个 Map 传给自定义的类,进行相关属性的赋值。 前端一般把json字符串解析成map之后,就直接用这个map进行相关的属性赋值了,老师能解释一下,传给自定义类的做法的好处吗?
作者回复: 以对象的方式承接服务端返回的JSON字典,不仅更直观,也避免了一些因为key写错出现的代码错误。js的类型系统比较混乱,object和字典是可以混用的,比如下面这段代码: var x = {'number':123,'title':'title'}; x.number和x['number']是等价的,所以这也就是为什么前端同学直接拿字典就可以当对象用了。 而Dart是强类型语言,字典里的键值对和对象的属性是不能混用的,所以我们需要定义一层映射关系。
共 2 条评论2 - 飓风2020-07-21https://github.com/trevorwang/retrofit.dart/ 这个库配合dio,网络请求转换这一步我觉得更简单点?1
- Geek_0d3a082019-08-29重定向监听有吗?
作者回复: Dio默认会自动帮你重定向,你可以在options参数里面把followRedirects置为false,自己在拦截器中处理重定向
1 - 江厚宏2019-08-22老师能不能介绍一下反序列化工具,比如json_serializable和 built_value,建议用哪一个,如果遇到泛型,该如何处理
作者回复: 其实我觉得Dart提供的JSON自动序列化方案并不好用,所以我还是推荐手动解析,对于泛型,直接在运行是判断类型,走对应的解析方法就可以了。 看你的使用场景,一般而言,json_serializable易用性上比built_value会更好一些。
1 - 李鑫鑫2022-02-26带有泛型 的bean 这么转json????
- 小何2021-07-30老师好,问一个问题,flutter怎么做回调啊,我想封装一个工具类,网络请求的时候传入callback,然后成功就调用callback.onSuccess(t),失败就调用callback.onFailed(t)
- 小何2021-07-21老师好,compute和Future区别是什么啊, 不是用Future也可以实现异步嘛共 1 条评论
- 任逍遥2021-07-12最近遇到一个问题,问一下老师服务器更新SSL证书时使用了pem格式,发现安卓端请求失败,iOS端正常,flutter应该如何兼容pem证书呢
- IF-Processing2020-02-07请问,flutter对于网络服务(比如Samba,NFS共享)的访问有支持吗?
- 安南寸暖🤕2019-11-07json_model 怎么生成纯数组的解析代码?
作者回复: 参考官方文档吧https://github.com/flutterchina/json_model
- 大神博士2019-09-21想问下 Flutter 中 JSONP 的请求怎么处理
作者回复: 1.直接发url请求就可以了、把服务端返回的数据当作字符串简单处理下,把它转成json格式 2.flutter不需要处理跨域问题,不建议用jsonp这种奇怪的格式
共 2 条评论 - 米米呀👧2019-09-10import '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包啊
- Geek_joestar2019-09-08static List<Teacher> fromJsonList(List<dynamic> listJson){ var list = List<Teacher>(); for(Map<String, dynamic> parsedJson in listJson) { list.add(Teacher.fromJson(parsedJson)); } return list; }展开
作者回复: 赞
- C2019-09-06class Teacher { String name; int age; Teacher({this.name, this.age}); factory Teacher.fromJson(Map<String, dynamic> parsedJson) { return Teacher( name: parsedJson['name'], age: parsedJson['age'], ); } static List<Teacher> parseTeachers(List<dynamic> mapList) { List<Teacher> teachers = List<Teacher>(); for(Map<String, dynamic> map in mapList) { teachers.add(Teacher.fromJson(map)); } return teachers; } } 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: Teacher.parseTeachers(parsedJson['teachers']), ); } }展开
作者回复: 很赞👍
- 大和2019-09-04dio.interceptors.add(InterceptorsWrapper( onRequest: (RequestOptions options) async { if (options.headers["token"] == null) { try { var token = await new Dio().get("https://xxx.com/token"); options.headers["token"] = token; }catch(e) { return dio.reject("Error: 请先登录..."); } } return options; } ));展开
作者回复: 思路是对的,有一个小点可以改进:如果此刻有多个request同时发出,token会请求多次。
- 宁缺2019-09-03请问老大,课后作业的答案啥时候给参考一下
作者回复: 会考虑专门出一节讲课后题的解决思路