Best way to set default header for all request in flutter http request

前端 未结 5 1735
臣服心动
臣服心动 2021-02-04 02:04

Sorry if this question so basic, but I am new to flutter and recently couldn\'t find a good way to set a default headers in the HTTP request I can extend the class or wrap a fun

5条回答
  •  忘掉有多难
    2021-02-04 02:40

    Register custom HttpClientFactory

    Dart allows to register a factory for creating an HttpClient

    class MyHttpOverrides extends HttpOverrides {
      @override
      HttpClient createHttpClient(SecurityContext context) {
        return new MyHttpClient(super.createHttpClient(context));
      }
    }
    
    void main() {
      HttpOverrides.global = new MyHttpOverrides();
      runApp(MyApp());
    }
    

    Implement custom HttpClient

    Implementing such a custom HttpClient seems overly complicated, but perhaps there is a better way.

    The class implements HttpClient from dart:io and all its abstract classes.

    The methods get(...) and getUrl(...) are customized to add a custom header using _updateHeaders(...). You would need to extend that to all other methods like 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 Function(Uri url, String scheme, String realm) f) =>
          _realClient.authenticate = f;
    
      @override
      void set authenticateProxy(
              Future 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 delete(String host, int port, String path) =>
          _realClient.delete(host, port, path);
    
      @override
      Future deleteUrl(Uri url) => _realClient.deleteUrl(url);
    
      @override
      void set findProxy(String Function(Uri url) f) => _realClient.findProxy = f;
    
      @override
      Future get(String host, int port, String path) =>
          _updateHeaders(_realClient.get(host, port, path));
    
      Future _updateHeaders(
          Future httpClientRequest) async {
        return (await httpClientRequest)..headers.add('foo', 'bar');
      }
    
      @override
      Future getUrl(Uri url) =>
          _updateHeaders(_realClient.getUrl(url.replace(path: url.path)));
    
      @override
      Future head(String host, int port, String path) =>
          _realClient.head(host, port, path);
    
      @override
      Future headUrl(Uri url) => _realClient.headUrl(url);
    
      @override
      Future open(
              String method, String host, int port, String path) =>
          _realClient.open(method, host, port, path);
    
      @override
      Future openUrl(String method, Uri url) =>
          _realClient.openUrl(method, url);
    
      @override
      Future patch(String host, int port, String path) =>
          _realClient.patch(host, port, path);
    
      @override
      Future patchUrl(Uri url) => _realClient.patchUrl(url);
    
      @override
      Future post(String host, int port, String path) =>
          _realClient.post(host, port, path);
    
      @override
      Future postUrl(Uri url) => _realClient.postUrl(url);
    
      @override
      Future put(String host, int port, String path) =>
          _realClient.put(host, port, path);
    
      @override
      Future putUrl(Uri url) => _realClient.putUrl(url);
    }
    

提交回复
热议问题