发生异常。 FormatException(FormatException:意外字符(在字符1处)<HTML> </HTML> ^)

时间:2019-12-14 10:44:03

标签: flutter dart

我正在创建一个新闻应用程序,我通过JSON获取数据,并且在每次运行我的应用程序时,我都无法理解(response HTTP):

  

Exception has occurred. FormatException (FormatException: Unexpected character (at character 1 <HTML></HTML> ^ )

代码:

import 'package:http/http.dart' as http;
import 'dart:convert';

class Category {

  int id;
  String title;

  Category({ 
    this.id,
    this.title 
  });

  static Future<List<Category>> getCategories() async {

    http.Response response = await http.get("url JSON"); // <- Here carash

    Map<String, dynamic> map = json.decode(response.body);

    List<Category> list = [];

    for(var map in map['categories']){
      list.add(
        Category(id: map['id'], title: map['title'])
      );
    }
    return list;
  }

}

2 个答案:

答案 0 :(得分:1)

我认为您的请求做错了,并且api无法处理该错误,并且我猜是将错误抛出为html。无论如何,您解码的方式不是正确的方式。

在执行http请求时要记住的几点:

  • 最重要的是研究数据类型(HTML / JSON)和 数据。通过打印到控制台或使用卷曲请求或邮递员的好方法。
  • 始终确保将nginxjson.decode()包装 块,当有错误时,您可以正确地看到发生了什么 和您的代码。
  • 确保您的响应状态代码为200。并偶尔处理数据。
  • 在迭代解码的响应之前,请确保它包含 值。
  • 如果您不知道类型,或者您不知道 当然,无需使用静态类型来分配解码的响应主体使用 try - catch(不要总是使用动态类型,我的建议仅用于这种情况)。这样可以final帮助您解决所面临的情况。
  • 最后但并非最不重要的一点,当您要使用状态代码检查错误消息时。例如 检查FormatException时,您将获得expired jwt作为状态码。 因此,在这种情况下,仅检查状态码是不够的 因为500的意思是500

例如: 清单清单= [];

internal server error

希望此功能对您有帮助。请按照上述步骤操作,如果还有其他错误,请通知我。

答案 1 :(得分:0)

您收到的响应不是JSON,因此您的JSON无法解码。

您的服务器返回了一些HTML标记,这意味着您可能请求的URL错误,请在PostMan或Browser中检查URL,然后查看响应。