【发布时间】:2019-03-09 22:09:41
【问题描述】:
我正在开发一个带有颤振的应用程序,并且我在 dart 中使用默认的 http 包进行 API 调用。我们如何记录所有正在通过的 http 请求。 http 或中间件中是否有任何内置功能可用于相同的功能?
【问题讨论】:
我正在开发一个带有颤振的应用程序,并且我在 dart 中使用默认的 http 包进行 API 调用。我们如何记录所有正在通过的 http 请求。 http 或中间件中是否有任何内置功能可用于相同的功能?
【问题讨论】:
似乎没有内置的方式来记录请求。但是,您可以实现自己的Client 来记录请求:
class MyClient extends BaseClient {
MyClient(this.delegate);
final Client delegate;
Future<StreamedResponse> send(BaseRequest request) {
_logRequest(request);
return delegate.send(request);
}
void close() => delegate.close();
void _logRequest(BaseRequest request) => ....;
}
【讨论】:
按原样调试解决方案
class LoggableHttpClient extends BaseClient {
final Client _delegate;
final Logger _logger;
LoggableHttpClient(this._delegate, this._logger);
@override
void close() {
_delegate.close();
}
@override
Future<StreamedResponse> send(BaseRequest request) async {
String s = "${request.method} ${request.url} -->";
s += "\nheader: ${request.headers}";
if(request is Request && request.body.length>0) {
s += "\nbody: ${request.body}";
}
_logger.info(s);
final response = await _delegate.send(request);
s = "${request.method} ${request.url} <--";
s += "\nheader: ${response.headers}";
// Simple request
if(request is Request) {
final List<int> bytes = await response.stream.toBytes();
s += "\nbody: ${await utf8.decode(bytes)}";
_logger.info(s);
return StreamedResponse(
ByteStream.fromBytes(bytes),
response.statusCode,
contentLength: response.contentLength,
request: request,
headers: response.headers,
isRedirect: response.isRedirect,
persistentConnection: response.persistentConnection,
reasonPhrase: response.reasonPhrase
);
}
_logger.info(s);
return response;
}
}
【讨论】:
您可以使用 http_logger 像这样将它们添加到您的 pubspec.yaml
http: ^0.11.3+16
http_middleware: ^1.0.0
http_logger: ^1.0.0
请注意:http_logger 1.0.0 仅适用于 http 0.11.3+16。 (2020 年 2 月 4 日更新)。
然后像这样将它们导入到文件中:
import 'package:http_middleware/http_middleware.dart';
import 'package:http_logger/http_logger.dart';
import 'package:http/http.dart' as http;
并使用它们:
HttpWithMiddleware httpClient = HttpWithMiddleware.build(middlewares: [
HttpLogger(logLevel: LogLevel.BODY),
]);
final http.Response response = await httpClient.post(
"https:nhatvm.com/v1/user/login",
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(<String, String>{'email': email, 'password': password}),
);
【讨论】:
您可以像这样将用户 pretty_http_logger 添加到您的 pubspec.YAML 中
pretty_http_logger: ^0.2.1
并像这样使用它:
HttpWithMiddleware http = HttpWithMiddleware.build(middlewares: [
HttpLogger(logLevel: LogLevel.BODY),
]);
就是这样!现在继续像往常一样使用这个 http 对象。
简单的 POST 请求
var response = await http.post('https://jsonplaceholder.typicode.com/posts/',
body: {"testing", "1234"});
简单的 GET 请求
var response = await http.get('https://jsonplaceholder.typicode.com/posts/');
它将以易于阅读且美观的适当格式打印出所有标头、请求正文、响应和错误。
【讨论】: