我正在try 为我的DART服务器应用程序编写一些测试,并且我一直在使用HttpClient类(以及相关的HttpClientRequest和HttpClientResponse类来向服务器发出测试请求)(请注意,我使用这些类是因为我需要dart:IO包来运行服务器,所以我不能同时导入dart:html).到目前为止,这一切都进行得相当顺利,我已经能够编写测试来判断服务器返回的响应是否具有正确的HTTP状态代码.我用来进行这些测试调用的代码基础如下:

Future<HttpClientResponse> makeServerRequest(String method, Uri uri, [String jsonData]) async {
  HttpClient client = new HttpClient();
  HttpClientRequest request = await client.openUrl(method, uri);
  request.write(jsonData);
  return request.close();
}

现在我需要编写一个测试来确保响应的主体,而不仅仅是状态代码,是正确的.问题是,我似乎找不到任何允许我实际访问HttpClient*类中的响应体的东西.到目前为止,我能找到的最接近的是HttpClientResponse.contentLength属性,但这只告诉我响应体有多大,而不是实际内容.

如何从这些请求中检索响应正文?或者,如果您不能,有没有其他方法可以让我在服务器端应用程序上发出请求,以便我可以读取响应?

推荐答案

HttpClientResponse对象是Stream,因此您可以使用listen()方法读取它:

response.listen((List<int> data) {
  //data as bytes
});

您还可以使用dart:convert中的编解码器来解析数据.下面的示例将响应内容读取为字符串:

import 'dart:io';
import 'dart:convert';
import 'dart:async';

Future<String> readResponse(HttpClientResponse response) {
  final completer = Completer<String>();
  final contents = StringBuffer();
  response.transform(utf8.decoder).listen((data) {
    contents.write(data);
  }, onDone: () => completer.complete(contents.toString()));
  return completer.future;
}

Dart相关问答推荐

dart 日期时差(分钟)

Dart - 检测未完成的期货

如何在 Flutter 的 firebase_database 中执行事务?

Flutter Getx - 未找到Xxx.您需要调用Get.put(Xxx()) - 但我已调用 Get.put(Xxx())

从 Dart 中的工厂构造函数返回 null 是否可以接受?

你如何在 Polymer 中调度和监听自定义事件?

如何为 spawnUri 动态构建 Dart 脚本?

如何go 除字符串中的变音符号?

如何在Flutter应用程序中使用套接字?

无法导入 dart 的 intl 包

如何在Dart中处理JSON

Firebase 手机身份验证Flutter crash崩溃

Dart 2:Future 和 Future 之间的区别

如何循环遍历元素列表

Dart:如何判断变量类型是否为字符串

如何在 Dart 中将 UTF-8 字符串转换为字节数组?

Dart 中 == 和 === 有什么区别?

Dart 会支持服务器端开发吗?

Dart 中的错误与异常

Dart:创建一个从 0 到 N 的列表