为Flutter HTTP请求中的所有请求设置默认标头的最佳方法

Pot*_*ato 8 header http dart flutter

抱歉,如果这个问题如此基本,但是我不熟悉该问题,最近又找不到在HTTP请求中设置默认标头的好方法,我可以扩展该类或为其包装一个函数,但是不应该有一个内置的简单方法,但我在文档中找不到。

Mar*_*yns 13

使用dio包可以很容易地做到这一点。

https://pub.dartlang.org/packages/dio

var dio = Dio();
dio.interceptor.request.onSend = (Options options) {      
  options.headers["headerKey"] = headerValue;
  return options;      
};

Response response = await dio.get("url");
print(response.data.toString());
Run Code Online (Sandbox Code Playgroud)

  • 这个 dio 对象会在我的所有小部件之间共享吗?如果没有,这个设置只会影响这个dio对象。 (2认同)

Gün*_*uer 11

注册自定义 HttpClientFactory

Dart 允许注册一个工厂来创建一个 HttpClient

class MyHttpOverrides extends HttpOverrides {
  @override
  HttpClient createHttpClient(SecurityContext context) {
    return new MyHttpClient(super.createHttpClient(context));
  }
}

void main() {
  HttpOverrides.global = new MyHttpOverrides();
  runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)

实现自定义 HttpClient

实现这样的自定义HttpClient看起来过于复杂,但也许有更好的方法。

该类实现HttpClientfromdart:io及其所有抽象类。

方法get(...)getUrl(...)被定制为使用_updateHeaders(...). 您需要将其扩展到所有其他方法,例如head, headUrl, open, post, ...

import 'dart:io';

class MyHttpClient implements HttpClient {
  HttpClient _realClient;

  MyHttpClient(this._realClient);

  @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) =>
      _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) =>
      _realClient.post(host, port, path);

  @override
  Future<HttpClientRequest> postUrl(Uri url) => _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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现它很有用,但我仍然认为它有点过于复杂 (2认同)
  • 我也这么认为。 (2认同)

小智 8

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

class MyClient extends http.BaseClient{
  http.Client _httpClient = new http.Client();

  MyClient(Map defaultHeaders);

  @override
  Future<http.StreamedResponse> send(http.BaseRequest request) {
    request.headers.addAll(defaultHeaders);
    return _httpClient.send(request);
  }
}
Run Code Online (Sandbox Code Playgroud)


Rez*_*ari 5

这种简单易行的方法对我有用

var _dio = Dio();
_dio.options.headers= {"Authorization" : token};
Run Code Online (Sandbox Code Playgroud)