FormatException случайно возникает при загрузке JSON - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь загрузить json данные из пользовательского API, размещенного в Heroku, код работает без проблем большую часть времени, но случайно я получаю эту ошибку

flutter: FormatException: Unexpected character (at character 1)
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum...
^

Я получаю эту ошибку время от времени, но если я перезагружаю тот же файл по той же ссылке, он работает, я пробовал все, но все еще не могу исправить.

RandomData.dart

import 'package:digest/random.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

class RandomData extends ChangeNotifier {
  List<Random> articles = [];


  String utf8convert(String text) {
    List<int> bytes = text.toString().codeUnits;
    return utf8.decode(bytes);
  }

  Future addArticle(String url) async {
    try {
  http.Response _response = await http.get("http://randomapi.com/1?q=${url.trim()}");
  var decoded = utf8convert(_response.body.toString());
  var decodedData = jsonDecode(decoded);

  articles.add(Random(
    title: decodedData['title'],
    dateAdded: 'Added ${monthNames[date.month-1]} ${date.day}, ${date.year}',
    link: url,
    imageUrl: decodedData['image'],
));
  notifyListeners();

} catch (e) {
  print(e);
    }
  }
}

JSON Ответ:

{
  "item_id": 5,
  "title": "Example Domain",
  "image": "",
  "authors": [],
  "date": null,
  "video_links": [],
  "full_text": "Example Domain\n\nThis domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.\n\nMore information...",
}

Пожалуйста, помогите мне исправить это.

1 Ответ

1 голос
/ 24 апреля 2020

У нас недавно была похожая проблема в нашем приложении. Это было вызвано тем, что сервер возвратил статус 502 Bad Gateway, следовательно, ответ не содержал JSON -тела, а HTML. Вы можете проверить, так ли это, проверив код состояния перед расшифровкой:

if (_response.statusCode == 200) {
  var decoded = // ...
} else {
  print('Something went wrong; status: ${_response.statusCode}');
}

Я вполне уверен, что это именно тот случай, поскольку в качестве исключения вы получаете HTML вместо ожидаемого JSON: <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum...

...