1

我正在尝试学习在 Flutter 中进行 api 调用,并制作一个至少对我有用的应用程序!

为此,我正在调用 Nifty 的(印度证券交易所)API:https ://www.nseindia.com/api/option-chain-indices?symbol=NIFTY

我正在使用以下代码来实现我的目标

import 'dart:convert';

import 'package:http/http.dart';

final url = 'https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY';

Future<Map<String, dynamic>> fetchNiftyData() async {
  final response = await get(
    Uri.parse(url),
  );

  Map<String, dynamic> responseBody = jsonDecode(response.body);
  return responseBody;
}

有用。它按原样从api返回数据!

但有时不是。在重新启动应用程序时,它可能会再次运行,也可能无法运行。我不希望我的应用程序在调用 api 时如此不一致。

这是我得到的错误堆栈:

Restarted application in 3,418ms.
E/flutter ( 3901): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: FormatException: Unexpected character (at character 1)
E/flutter ( 3901): <!DOCTYPE html>
E/flutter ( 3901): ^
E/flutter ( 3901):
E/flutter ( 3901): #0      _ChunkedJsonParser.fail (dart:convert-patch/convert_patch.dart:1404:5)
E/flutter ( 3901): #1      _ChunkedJsonParser.parseNumber (dart:convert-patch/convert_patch.dart:1271:9)
E/flutter ( 3901): #2      _ChunkedJsonParser.parse (dart:convert-patch/convert_patch.dart:936:22)
E/flutter ( 3901): #3      _parseJson (dart:convert-patch/convert_patch.dart:40:10)
E/flutter ( 3901): #4      JsonDecoder.convert (dart:convert/json.dart:506:36)
E/flutter ( 3901): #5      JsonCodec.decode (dart:convert/json.dart:157:41)
E/flutter ( 3901): #6      jsonDecode (dart:convert/json.dart:96:10)
E/flutter ( 3901): #7      fetchBankNiftyData
package:options_trader/Services/fetch_bank_nifty_data.dart:12
E/flutter ( 3901): <asynchronous suspension>
E/flutter ( 3901): #8      _BankNiftyScreenState.getBankNiftyData
package:options_trader/Screens/bank_nifty_screen.dart:21
E/flutter ( 3901): <asynchronous suspension>
E/flutter ( 3901):

最后,这就是我调用/使用获取的数据的方式......

import 'package:flutter/material.dart';

import '../Services/fetch_nifty_data.dart';

class NiftyScreen extends StatefulWidget {
  @override
  _NiftyScreenState createState() => _NiftyScreenState();
}

class _NiftyScreenState extends State<NiftyScreen> {
  Map<String, dynamic>? niftyDetails = {};

  @override
  void initState() {
    super.initState();
    getNiftyDetails();
  }

  getNiftyDetails() async {
    this.niftyDetails = await fetchNiftyData();
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: niftyDetails!.isNotEmpty
          ? ListView.builder(
              itemCount: niftyDetails!["filtered"]["data"].length,
              itemBuilder: (_, index) {
                return ListTile(
                  title: Text(
                      '${niftyDetails!["filtered"]["data"][index]["strikePrice"]}'),
                );
              },
            )
          : LinearProgressIndicator(),
    );
  }
}

我究竟做错了什么?最佳做法是什么?TIA

4

1 回答 1

1

<!DOCTYPE html>当 API 没有以您期望的格式(即 json)返回您想要的数据时,会导致该错误,但它会返回一个错误页面,很可能是 404,它以 开头<!DOCTYPE html>,而不是{"records":{"expiryDates"...etc]可以使用 jsonDecode 解析的.

如果它工作了几次,而其他人没有,这很可能不是你的问题,它可能是由 API 本身的速率限制引起的,这解释了为什么它稍后会再次工作,而无需更改代码。

于 2021-04-30T08:55:25.543 回答