我正在使用奥地利公共(public)交通API的OGD进行一个项目,该项目仅要求带有“stopID”的 setter/getter 。您也可以串联多个stopID。
这意味着,如果您尝试此链接,则会收到包含stopIDs的所有数据的响应:
http://www.wienerlinien.at/ogd_realtime/monitor?&stopId=2913&stopId=2918&stopId=2921&stopId=3387&stopId=4133&stopId=4134
现在这是我的问题:
编号为4133的stopID(在http://www.wienerlinien.at/ogd_realtime/monitor?&stopId=4133上尝试使用)在坐标中具有NULL值。通常,我只会做一些NULL检查,但是有一些我从未见过的奇怪行为。我已经调试到错误的地步。它在HTTP.get Request上说:

I/flutter (29464): ERROR: Invalid argument(s) (input): Must not be null
但是,如果我现在还没有得到答复,那怎么可能呢?
它尝试请求并在建立响应时中断某处。
这是它的请求代码(finalURl是上面的URL):
    final Response response = await http.get(finalUrl);
    if (response.statusCode == 200) {
      final encode = jsonDecode(response.body);
}
该错误甚至发生在if语句和解析json字符串之前。
因此,在获得适当的响应对象之前。如果您现在问,由于坐标字段中的NULL类型,我怎么知道为什么会发生这种情况,我已经尝试了不带ID 4133的Request,并且效果很好。如果仅使用第二个请求链接(仅ID 4133),则会引发错误。
有人知道那里怎么了吗?这绝对是Dart / Flutter的问题,我错过了什么吗?

最佳答案

我不确定您如何导入http包。如果您使用“http”别名来调用get(),请确保按以下方式导入,

import 'package:http/http.dart' as http;
并使用包中的Response类作为
http.Response;
我试图从给定的URL获取数据,它对我有用。
...
import 'package:http/http.dart' as http;
...

Future<void> fetchData() async {

    const url = "http://www.wienerlinien.at/ogd_realtime/monitor?&stopId=4133";

    final http.Response response = await http.get(url);
    final data = json.decode(response.body) as Map<String, dynamic>;
    print(data);

}
另外,您可以跳过该类,让Dart推断响应类型,如下所示:
...
import 'package:http/http.dart' as http;
...

Future<void> fetchData() async {

    const url = "http://www.wienerlinien.at/ogd_realtime/monitor?&stopId=4133";

    final response = await http.get(url);
    final data = json.decode(response.body) as Map<String, dynamic>;
    print(data);

}
调试控制台:
I/flutter (20609): {data: {monitors: [{locationStop: {type: Feature, geometry: {type: Point, coordinates: [null, null]}, properties: {name: 60200949, title: Oberlaa, municipality: Wien, municipalityId: 90001, type: stop, coordName: WGS84, gate: 2, attributes: {rbl: 4133}}}, lines: [{name: U1, towards: NICHT EINSTEIGEN ! NO DEPARTURE PLATFORM, direction: R, platform: 2, richtungsId: 2, barrierFree: true, realtimeSupported: true, trafficjam: false, departures: {departure: [{departureTime: {}, vehicle: {name: U1, towards: NICHT EINSTEIGEN ! NO DEPARTURE PLATFORM, direction: R, richtungsId: 2, barrierFree: false, realtimeSupported: true, trafficjam: false, type: ptMetro, attributes: {}, linienId: 301}}]}, type: ptMetro, lineId: 301}], attributes: {}}]}, message: {value: OK, messageCode: 1, serverTime: 2020-07-19T15:55:30.000+0200}}
然后,您可以对数据进行空检查。还要在调用fetchData()函数的位置将代码放在try catch块中,以正确处理错误。

07-24 09:49