从HttpClientResponse中检索响应主体

Mic*_*ick 7 dart

我正在尝试为我的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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

小智 12

HttpClientResponse目标是一个Stream,所以你可以用阅读listen()方法:

response.listen((List<int> data) {
  //data as bytes
});
Run Code Online (Sandbox Code Playgroud)

您还可以使用编解码器dart:convert来解析数据.以下示例将响应内容读取到String:

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

Future<String> readResponse(HttpClientResponse response) {
  var completer = new Completer();
  var contents = new StringBuffer();
  response.transform(utf8.decoder).listen((data) {
    contents.write(data);
  }, onDone: () => completer.complete(contents.toString()));
  return completer.future;
}
Run Code Online (Sandbox Code Playgroud)

  • 仅仅读取 Http 响应的正文怎么会这么难看?飞镖太糟糕了。 (3认同)

Sur*_*gch 6

低级

这是await for收集响应流的版本。它比使用完成器更紧凑。

Future<String> readResponse(HttpClientResponse response) async {
  final contents = StringBuffer();
  await for (var data in response.transform(utf8.decoder)) {
    contents.write(data);
  }
  return contents.toString();
}
Run Code Online (Sandbox Code Playgroud)

您应该将其包装在一个try catch块中以处理错误。

高水平

大多数情况下,您会在客户端使用该http库:

// import 'package:http/http.dart';

Response response = await get(url);
String content = response.body;
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅此文章