从 HttpClientResponse 中检索响应正文
Retrieving the response body from an HttpClientResponse
我正在尝试为我的 Dart 服务器应用程序编写一些测试,并且我一直在使用 HttpClient class(以及相关的 HttpClientRequest 和 HttpClientResponse classes 来发出测试请求到服务器(请注意,我正在使用这些 classes 因为我需要 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* classes 中的响应主体的内容。到目前为止我能找到的最接近的是 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;
}
低水平
这是收集响应流的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();
}
您应该将其包装在 try catch
块中以处理错误。
高水平
大多数情况下,您会在客户端使用 http
库:
// import 'package:http/http.dart';
Response response = await get(url);
String content = response.body;
有关详细信息,请参阅 this article。
从 HttpClientResponse
中获取正文的一种简便方法是:
Future<String> readResponse(HttpClientResponse response) async {
return response.transform(utf8.decoder).join();
}
我正在尝试为我的 Dart 服务器应用程序编写一些测试,并且我一直在使用 HttpClient class(以及相关的 HttpClientRequest 和 HttpClientResponse classes 来发出测试请求到服务器(请注意,我正在使用这些 classes 因为我需要 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* classes 中的响应主体的内容。到目前为止我能找到的最接近的是 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;
}
低水平
这是收集响应流的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();
}
您应该将其包装在 try catch
块中以处理错误。
高水平
大多数情况下,您会在客户端使用 http
库:
// import 'package:http/http.dart';
Response response = await get(url);
String content = response.body;
有关详细信息,请参阅 this article。
从 HttpClientResponse
中获取正文的一种简便方法是:
Future<String> readResponse(HttpClientResponse response) async {
return response.transform(utf8.decoder).join();
}