Flutter 颤振http请求有时显示错误
我正在努力学习在Flutter中进行api调用,并制作一个至少对我有用的应用程序 为此,我打电话给Nifty的(印度证券交易所)API: 我使用以下代码来实现我的目标Flutter 颤振http请求有时显示错误,flutter,dart,flutter-layout,flutter-dependencies,Flutter,Dart,Flutter Layout,Flutter Dependencies,我正在努力学习在Flutter中进行api调用,并制作一个至少对我有用的应用程序 为此,我打电话给Nifty的(印度证券交易所)API: 我使用以下代码来实现我的目标 import 'dart:convert'; import 'package:http/http.dart'; final url = 'https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY'; Future<Map<String, dyna
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;
}
导入'dart:convert';
导入“包:http/http.dart”;
最终url=https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY';
Future fetchNiftyData()异步{
最终响应=等待获取(
解析(url),
);
Map responseBody=jsonDecode(response.body);
返回响应体;
}
它起作用了。它会按原样从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):
在3418ms内重新启动应用程序。
E/flatter(3901):[错误:flatter/lib/ui/ui\u dart\u state.cc(186)]未处理的异常:FormatException:意外字符(在字符1处)
E/颤振(3901):
E/颤振(3901):^
E/颤振(3901):
E/flatter(3901):#0_ChunkedJsonParser.fail(dart:convert patch/convert_patch.dart:1404:5)
E/flatter(3901):#1 _ChunkedJsonParser.parseNumber(dart:convert patch/convert_patch.dart:1271:9)
E/flatter(3901):#2 _ChunkedJsonParser.parse(dart:convert patch/convert_patch.dart:936:22)
E/flatter(3901):#3(省道:转换补丁/转换补丁。省道:40:10)
E/flatter(3901):#4 JsonDecoder.convert(dart:convert/json.dart:506:36)
E/flatter(3901):#5jsoncodec.decode(dart:convert/json.dart:157:41)
E/flatter(3901):#6 jsonDecode(dart:convert/json.dart:96:10)
E/颤振(3901):#7
套餐:选项\交易员/服务/获取\银行\数据。dart:12
E/颤振(3901):
E/颤振(3901):#8 BankNiftyScreenState.getBankNiftyData
包装:选项\交易员/屏幕/银行\漂亮屏幕。dart:21
E/颤振(3901):
E/颤振(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(),
);
}
}
导入“包装:颤振/材料.省道”;
导入“../Services/fetch_nifty_data.dart”;
类NiftyScreen扩展StatefulWidget{
@凌驾
_NiftyScreenState createState()=>NiftyScreenState();
}
类_NiftyScreenState扩展状态{
映射?niftyDetails={};
@凌驾
void initState(){
super.initState();
getNiftyDetails();
}
getNiftyDetails()异步{
this.niftyDetails=等待fetchNiftyData();
setState((){});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:niftyDetails!.isNotEmpty
?ListView.builder(
itemCount:niftyDetails![“筛选的”][“数据”]。长度,
itemBuilder:(\ux,索引){
返回列表块(
标题:正文(
“${niftyDetails![“筛选”][“数据”][索引][“删除项”]}”),
);
},
)
:LinearProgressIndicator(),
);
}
}
我做错了什么?最佳实践是什么?TIA当API没有以您期望的格式返回您想要的数据(json)时,会导致
错误,但它返回一个错误页面,很可能是404,它以
开头,而不是{“记录”:{“expiryDates”…等]
,可以使用jsonDecode解析
如果它工作了几次,而其他人没有,那么这很可能不是您的问题,而且可能是由于API本身限制了速率造成的,这解释了为什么它以后可以再次工作,而您不必更改代码。谢谢您的回答,伙计:)