使用 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;
main.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 并因此重建整个客户端 我正在寻找concat
和 AuthLink
的 HttpLink,但我找不到可以导入 AuthLink
的位置
只是一个更新,我已经切换到Artemis,我更喜欢它,因为它更好地将前端与后端分离,并且总体上更灵活,可根据用例定制。以上是关于使用 Ferry 和 Flutter 向请求添加标头的主要内容,如果未能解决你的问题,请参考以下文章
Flutter - StreamProvider - 向 Firebase 发送重复出现的 XHR 请求
如何使 Flutter graphql 订阅与轮渡包一起使用?
云原生之Docker实战使用Docker部署Ferry开源工单系统