flutter - 在 Flutter 中全局覆盖 http 包
问题描述
我正在尝试全局覆盖 http 包,以便拦截来自这个包的请求,该包在后台使用 http 包。在调用构造函数时,没有一个被覆盖的方法。我为 GET 和 POST 请求添加了打印语句。这是我的覆盖代码:
void main() {
HttpOverrides.global = MyHttpOverrides();
runApp(...);
}
class MyHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext context) {
var client = MyHttpClient(super.createHttpClient(context));
return client;
}
}
class MyHttpClient implements HttpClient {
HttpClient _realClient;
MyHttpClient(this._realClient) {
print("initialized");
}
@override
bool get autoUncompress => _realClient.autoUncompress;
@override
set autoUncompress(bool value) => _realClient.autoUncompress = value;
@override
Duration get connectionTimeout => _realClient.connectionTimeout;
@override
set connectionTimeout(Duration value) =>
_realClient.connectionTimeout = value;
@override
Duration get idleTimeout => _realClient.idleTimeout;
@override
set idleTimeout(Duration value) => _realClient.idleTimeout = value;
@override
int get maxConnectionsPerHost => _realClient.maxConnectionsPerHost;
@override
set maxConnectionsPerHost(int value) =>
_realClient.maxConnectionsPerHost = value;
@override
String get userAgent => _realClient.userAgent;
@override
set userAgent(String value) => _realClient.userAgent = value;
@override
void addCredentials(
Uri url, String realm, HttpClientCredentials credentials) =>
_realClient.addCredentials(url, realm, credentials);
@override
void addProxyCredentials(String host, int port, String realm,
HttpClientCredentials credentials) =>
_realClient.addProxyCredentials(host, port, realm, credentials);
@override
void set authenticate(
Future<bool> Function(Uri url, String scheme, String realm) f) =>
_realClient.authenticate = f;
@override
void set authenticateProxy(
Future<bool> Function(
String host, int port, String scheme, String realm)
f) =>
_realClient.authenticateProxy = f;
@override
void set badCertificateCallback(
bool Function(X509Certificate cert, String host, int port)
callback) =>
_realClient.badCertificateCallback = callback;
@override
void close({bool force = false}) => _realClient.close(force: force);
@override
Future<HttpClientRequest> delete(String host, int port, String path) =>
_realClient.delete(host, port, path);
@override
Future<HttpClientRequest> deleteUrl(Uri url) => _realClient.deleteUrl(url);
@override
void set findProxy(String Function(Uri url) f) => _realClient.findProxy = f;
@override
Future<HttpClientRequest> get(String host, int port, String path) {
print("get called");
return _updateHeaders(_realClient.get(host, port, path));
}
Future<HttpClientRequest> _updateHeaders(
Future<HttpClientRequest> httpClientRequest) async {
return (await httpClientRequest)..headers.add('foo', 'bar');
}
@override
Future<HttpClientRequest> getUrl(Uri url) =>
_updateHeaders(_realClient.getUrl(url.replace(path: url.path)));
@override
Future<HttpClientRequest> head(String host, int port, String path) =>
_realClient.head(host, port, path);
@override
Future<HttpClientRequest> headUrl(Uri url) => _realClient.headUrl(url);
@override
Future<HttpClientRequest> open(
String method, String host, int port, String path) =>
_realClient.open(method, host, port, path);
@override
Future<HttpClientRequest> openUrl(String method, Uri url) =>
_realClient.openUrl(method, url);
@override
Future<HttpClientRequest> patch(String host, int port, String path) =>
_realClient.patch(host, port, path);
@override
Future<HttpClientRequest> patchUrl(Uri url) => _realClient.patchUrl(url);
@override
Future<HttpClientRequest> post(String host, int port, String path) {
print("post called");
return _realClient.post(host, port, path);
}
@override
Future<HttpClientRequest> postUrl(Uri url) {
print("postUrl called");
return _realClient.postUrl(url);
}
@override
Future<HttpClientRequest> put(String host, int port, String path) =>
_realClient.put(host, port, path);
@override
Future<HttpClientRequest> putUrl(Uri url) => _realClient.putUrl(url);
}
这是触发 POST 请求的代码:
http.post(
requestData.uri,
headers: requestData.headers,
body: requestData.body,
);
我还尝试在没有 http 包的情况下发出 POST 请求,在这种情况下,将按预期调用被覆盖的方法。
String _host = InternetAddress.loopbackIPv4.host;
String path = 'file.txt';
Map jsonData = {
'name': 'Han Solo',
'job': 'reluctant hero',
'BFF': 'Chewbacca',
'ship': 'Millennium Falcon',
'weakness': 'smuggling debts'
};
HttpClientRequest request = await HttpClient().post(_host, 4049, path) /*1*/
..headers.contentType = ContentType.json /*2*/
..write(jsonEncode(jsonData)); /*3*/
HttpClientResponse response = await request.close(); /*4*/
await utf8.decoder.bind(response /*5*/).forEach(print);
我需要做的 http 包有什么特别之处吗?