Arhn - архитектура программирования

Лучший способ установить заголовок по умолчанию для всех запросов в HTTP-запросе флаттера

Извините, если этот вопрос такой простой, но я новичок в флаттере и недавно не смог найти хороший способ установить заголовки по умолчанию в HTTP-запросе. Я могу расширить класс или обернуть в него функцию, но не должно ли быть простой встроенный способ, но я не смог найти его в документации.

23.01.2019

Ответы:


1

Это можно легко сделать с помощью пакета Dio.

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

Обновить

На основе нового Dio API:

var dio = Dio();
dio.interceptors.add(InterceptorsWrapper(onRequest: (RequestOptions options) async {
  var customHeaders = {
    'content-type': 'application/json'
    // other headers
  };
  options.headers.addAll(customHeaders);
  return options;
}));

Response response = await dio.get("url");
print(response.data.toString());

Дополнительные сведения см. в документации.

23.01.2019
  • перехватывая его на полпути, мне очень нравится это решение, это самый простой способ 23.01.2019
  • Будет ли этот объект dio использоваться всеми моими виджетами? Если нет, эта настройка повлияет только на этот дио-объект. 10.12.2019
  • В этом пакете есть критическая ошибка, из-за которой, если сервер выдает ›= 400, будет выдано неперехватываемое исключение. 03.02.2020

  • 2

    Зарегистрировать пользовательскую 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());
    }
    

    Реализовать пользовательский HttpClient

    Реализация такого пользовательского HttpClient кажется слишком сложной, но, возможно, есть лучший способ.

    Класс реализует HttpClient из dart: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);
    }
    
    23.01.2019
  • Я нашел это полезным, но все же я думаю, что это немного сложно 23.01.2019
  • Я тоже так думаю. 23.01.2019

  • 3

    этот простой и легкий способ сработал для меня

    var _dio = Dio();
    _dio.options.headers= {"Authorization" : token};
    
    24.09.2019

    4

    Просто расширяя идею @Radek Manasek о пользовательском Client, я переопределяю все методы, поэтому вам не нужно писать их снова.

    import 'dart:convert';
    
    import 'package:http/http.dart' as http;
    import 'package:http/http.dart';
    
    class MyClient extends http.BaseClient {
      final Map<String, String> _defaultHeaders;
      http.Client _httpClient = http.Client();
    
      MyClient(this._defaultHeaders);
    
      @override
      Future<http.StreamedResponse> send(http.BaseRequest request) {
        return _httpClient.send(request);
      }
    
      @override
      Future<Response> get(url, {Map<String, String> headers}) {
        return _httpClient.get(url, headers: _mergedHeaders(headers));
      }
    
      @override
      Future<Response> post(url, {Map<String, String> headers, dynamic body, Encoding encoding}) {
        return _httpClient.post(url, headers: _mergedHeaders(headers), body: body, encoding: encoding);
      }
    
      @override
      Future<Response> patch(url, {Map<String, String> headers, dynamic body, Encoding encoding}) {
        return _httpClient.patch(url, headers: _mergedHeaders(headers), body: body, encoding: encoding);
      }
    
      @override
      Future<Response> put(url, {Map<String, String> headers, dynamic body, Encoding encoding}) {
        return _httpClient.put(url, headers: _mergedHeaders(headers), body: body, encoding: encoding);
      }
    
      @override
      Future<Response> head(url, {Map<String, String> headers}) {
        return _httpClient.head(url, headers: _mergedHeaders(headers));
      }
    
      @override
      Future<Response> delete(url, {Map<String, String> headers}) {
        return _httpClient.delete(url, headers: _mergedHeaders(headers));
      }
    
      Map<String, String> _mergedHeaders(Map<String, String> headers) =>
          {...?_defaultHeaders, ...?headers};
    }
    
    19.08.2019
  • Как это может работать с глобальными переопределениями HTTP? HttpOverrides.createHttpClient должен возвращать HttpClient вместо BaseClient. 01.01.2020

  • 5
  • Вам не нужно создавать экземпляр другого Http-клиента. Возврат request.send() тоже работает :) 25.07.2020
  • @GuilhermeV. Если вы сделаете это, вы будете создавать новый http-клиент для каждого запроса вместо повторного использования существующего клиента, который, вероятно, является постоянным соединением. 30.12.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..