如何在 Flutter 中发出 API 请求
Posted
技术标签:
【中文标题】如何在 Flutter 中发出 API 请求【英文标题】:How to make an API request in Flutter 【发布时间】:2020-01-14 07:53:14 【问题描述】:我是 Flutter 的新手,所以我不确定我应该如何进行 API 调用,来自我使用 Retrofit 的 Java。
JSON 响应:
"total": 13,
"rows": [
"id": 1,
"name": "Name"
]
模型类:
class Category
int total;
List<Rows> rows;
Category(this.total, this.rows);
Category.fromJson(Map<String, dynamic> json)
total = json['total'];
if (json['rows'] != null)
rows = new List<Rows>();
json['rows'].forEach((v)
rows.add(new Rows.fromJson(v));
);
class Rows
String name;
Rows(this.name);
Rows.fromJson(Map<String, dynamic> json)
name = json['name'];
主类
List<Rows> rows = [];
Future<List<Rows>> getData() async
var response = await http.get(
Uri.encodeFull("http://192.168.0.10/api/v1/categories"),
headers:
"Authorization": "API",
"Accept": "application/json"
);
var jsonData = json.decode(response.body);
我不知道如何处理我尝试使用 Rows.fromJson() 获取对象,但我只得到'Instance of Rows',并且通过调用 name 我得到 null。
【问题讨论】:
【参考方案1】:该方法是正确的,但对于列表,您应该使用 list.map 来反序列化列表。
试试这个,我没有测试,我只是看你的例子写的
var response = await http.get(
Uri.encodeFull("http://192.168.0.10/api/v1/categories"),
headers:
"Authorization": "API",
"Accept": "application/json"
);
List<Rows> rows = [];
Map map = json.decode(response.body);
List l = map["rows"];
rows = l.map((map) => Rows.fromJson(map)).toList();
【讨论】:
非常感谢,效果很好。你能给我解释一下这条线吗? rows = l.map((map) => Rows.fromJson(map)).toList();究竟是什么 => Rows.fromJson(map)).toList(); 这是因为json.decode(..)
将json反序列化为Map
对象,而json中的数组反序列化为List<Map>
。当您访问map["rows"]
时,您会得到一个列表(隐式地图列表)。因此,您需要将列表中的所有地图转换为不同类型的对象。这是通过list.map(..)
函数完成的。使用 'map' 函数,列表中的每个对象都用于创建一个带有 Rows.fromJson(..)
的新对象【参考方案2】:
你可以使用json_serializable和json_annotation和build_runner
【讨论】:
以上是关于如何在 Flutter 中发出 API 请求的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Flutter/Dart 中使用 url 编码的标头和正文发出 HTTP POST 请求