如何在 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&lt;Map&gt;。当您访问map["rows"] 时,您会得到一个列表(隐式地图列表)。因此,您需要将列表中的所有地图转换为不同类型的对象。这是通过list.map(..) 函数完成的。使用 'map' 函数,列表中的每个对象都用于创建一个带有 Rows.fromJson(..) 的新对象【参考方案2】:

你可以使用json_serializable和json_annotation和build_runner

【讨论】:

以上是关于如何在 Flutter 中发出 API 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter/Dart 中使用 url 编码的标头和正文发出 HTTP POST 请求

我如何对嵌套在flutter中的json发出发布请求?

如何在 Flutter 上使用 cookie 发出 http 请求?

如何在颤振小部件测试中发出 http 请求?

如何在 Flutter 中使用 http 进行摘要认证?

如何从flutter应用程序向本地主机发出http get请求?