首页 > 解决方案 > Dart 未来的 HttpCLientRequest 返回 Null

问题描述

Requests 类设置了一个 HttpClientRequest。getTeamsJsonForRequest 方法应该返回 JSON 响应。但是,我假设没有正确分配变量“return”。.then 响应中的打印“CONTS”成功打印了正确的响应,但打印“myres”部分显示结果为空。不确定为什么未在 response.transform 部分分配结果。

class Requests {
    static Future getTeamsJsonForRequest(String reqPath) async{
        var result;
        HttpClient myhttp = new HttpClient();
        String path = '/api/v3' + reqPath;
        myhttp.get('www.thebluealliance.com', 80, path) 
        .then((HttpClientRequest request) {
            request.headers.set("accept", "application/json");
            request.headers.set("X-TBA-Auth-Key", "XXXXX");
            return request.close();
        })
        .then((HttpClientResponse response) {
             response.transform(utf8.decoder).transform(json.decoder).listen((conts) {
                print('CONTS: ' + conts.toString());
                result = json.decode(conts).toString();
            });
        });
        print('myres: ' + result.toString());
        return result;
        }
    }

标签: jsonhttpdart

解决方案


简短的回答:避免在方法Future.then内部使用async

在响应返回之前,您print正在执行。https://www.dartlang.org/tutorials/language/futures#async-await

在执行此函数中的后续语句之后,将不会发生await任何异步完成的工作。

这是我写这个的方法:

Future<String> teamsJsonForRequest(String requestPath) async {
  var client = new HttpClient();
  var path = '/api/v3$requestPath';
  var request = (await client.get('www.thebluealliance.com', 80, path))
    ..headers.set("accept", "application/json")
    ..headers.set("X-TBA-Auth-Key", "XXXXX");
  var response = await request.close();
  var result =
      await response.transform(utf8.decoder).transform(json.decoder).single;
  print('myres: $result');
  return result;
}

推荐阅读