使用 Ferry 和 Flutter 向请求添加标头

Posted

技术标签:

【中文标题】使用 Ferry 和 Flutter 向请求添加标头【英文标题】:Add headers to request using Ferry with Flutter 【发布时间】:2021-08-13 22:47:32 【问题描述】:

这是我第一次使用 Ferry 发出 GraphQL 请求。 我的 GraphQL Server 有一些查询需要 HTTP 标头进行授权。

我需要能够在初始化客户端后添加标头。

client.dart

Future<Client> initClient() async 
  await Hive.initFlutter();

  final box = await Hive.openBox<Map<String, dynamic>>("graphql");

  await box.clear();

  final store = HiveStore(box);

  final cache = Cache(store: store);

  final link = HttpLink("example.com/");

  final client = Client(
    link: link,
    cache: cache,
  );

  return client;

ma​​in.dart

void main() async
  final client = await initClient();
  GetIt.I.registerLazySingleton<Client>(() => client);
  runApp(MyApp());

请求文件

    client.request(Req).listen((response) 
      print(response.graphqlErrors); // It will return an error because theres no header with the token
      print(response.data);
    );

【问题讨论】:

在他们的 Github 上查看这篇文章,其中解释了如何添加标题。 github.com/gql-dart/ferry/issues/95 也是一个例子github.com/gql-dart/gql/blob/… @ChiragBargoojar 谢谢,我不知道我是否正确理解了代码,但该示例不会强制拥有令牌? 我不认为它会强迫你传递令牌只是尝试它是找出的唯一方法。 谢谢,我会试试的。 【参考方案1】:

为我试试这个实现工作!

从graphql_flutter保存auth_link.dar

工作示例

import 'dart:async';

import 'package:ferry/ferry.dart';
import 'package:ferry_hive_store/ferry_hive_store.dart';
import 'package:gql_http_link/gql_http_link.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'path_to/auth_link.dart';
Future<Client> initClient() async 
  final box = await Hive.openBox("graphql");
  await box.clear();
  final store = HiveStore(box);
  final cache = Cache(store: store);
  var httpLink = HttpLink('http://localhost:4000/graphql');
  final AuthLink authLink = AuthLink(
    getToken: () async => await getBoxToken(),
  );

  final Link link = authLink.concat(httpLink);
  final client = Client(
    link: link,
    cache: cache,
  );
  return client;


FutureOr<String> getBoxToken() async 
  final box = await Hive.openBox("fireToken");
  return 'Bearer $box.get('token')';

【讨论】:

【参考方案2】:

这是一个向 Ferry GraphQL 客户端请求添加标头的简单示例。在本例中,我们在请求中添加了 Authorization Bearer Token。

通过在创建HttpLink 对象时将对象添加到defaultHeaders 参数来添加标头。

graphql_service.dart

import 'package:ferry/ferry.dart';
import 'package:gql_http_link/gql_http_link.dart';

Client initGqlClient(String url) 
  final link = HttpLink(
    url,
    defaultHeaders: 
      'Authorization':
          'Bearer eyJ0eXAiOi...',
    ,
  );

  final client = Client(link: link);

  return client;

【讨论】:

嗨,如果我的不记名令牌需要更改(刷新后)在你的情况下,它需要重建整个 HttpLink 并因此重建整个客户端 我正在寻找 concatAuthLink 的 HttpLink,但我找不到可以导入 AuthLink 的位置 只是一个更新,我已经切换到Artemis,我更喜欢它,因为它更好地将前端与后端分离,并且总体上更灵活,可根据用例定制。

以上是关于使用 Ferry 和 Flutter 向请求添加标头的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - StreamProvider - 向 Firebase 发送重复出现的 XHR 请求

如何使 Flutter graphql 订阅与轮渡包一起使用?

云原生之Docker实战使用Docker部署Ferry开源工单系统

在 Function 中添加两个到一个按钮 Flutter

如何从flutter应用程序向本地主机发出http get请求?

Flutter Web,向具有自签名证书的服务器发出请求时出现问题