
Ferry JSON操作逃生舱3步快速编写非类型化GraphQL请求【免费下载链接】ferryStream-based strongly typed GraphQL client for Dart项目地址: https://gitcode.com/gh_mirrors/fer/ferryFerry 是一个流式的、强类型的 Dart GraphQL 客户端。平时我们用代码生成得到的强类型请求类来发送 GraphQL 查询但当你需要在运行时动态构造查询、或者处于无法运行代码生成的紧急场景时Ferry 提供了JSON 操作逃生舱JsonOperationRequest直接传入 GraphQL 文档原文和变量 Map返回未类型化的MapString, dynamic数据无需任何生成代码就能快速发出一次非类型化 GraphQL 请求。什么是 JSON 操作逃生舱Ferry 的常规流程是「代码生成 → 强类型请求类」但有几类场景例外⚡动态构造GraphQL 查询需要根据用户配置或业务状态在运行时拼接紧急调试还没写.graphql文件、代码生成没跑起来但要先验证接口是否可用临时探索试探服务端字段结构不值得为它写完整的类型类。这时可以直接使用 JsonOperationRequest。它的实现很简单——parseData直接把响应 JSON 原样返回跳过反序列化到具体类的步骤这正是「逃生舱」的含义绕过类型系统换取灵活性。3步完成非类型化GraphQL请求第1步解析GraphQL文档为Operation用gql包的parseString把查询文本解析成 AST再包进Operationfinal operation Operation( document: gql.parseString(r query Reviews { reviews(episode: $episode, first: $first) { id stars } } ), operationName: Reviews, );第2步构建 JsonOperationRequest三个必填项operation、fetchPolicy、vars变量是一个普通的MapString, dynamic没有编译期校验所以键名要与服务端对齐final req JsonOperationRequest( operation: operation, fetchPolicy: FetchPolicy.CacheFirst, vars: {episode: EMPIRE, first: 1}, );构造函数完整定义见 json_operation_request.dart还支持optimisticResponse、updateResult等可选参数和类型化请求保持一致。第3步通过Client发送请求调用方式与类型化请求完全相同响应数据就是原始 JSON Mapfinal result await client.request(req).first; final data result.data; // MapString, dynamic官方说明见 json-operation.md可运行的完整示例在 json_operation_test.dart。JSON 操作与缓存策略怎么选JSON 操作和类型化请求共享同一套缓存机制用FetchPolicy控制数据来源策略行为CacheFirst先返回缓存无缓存再走网络Query 默认NetworkOnly只请求网络结果写入缓存CacheAndNetwork先返回缓存随后再返回网络新数据CacheOnly只读缓存不发网络请求NoCache只请求网络不写入缓存上面的测试用例就验证了这一点同一请求第一次来自网络DataSource.Link第二次直接命中缓存DataSource.Cache。各策略的详细行为见 fetch-policies.md。什么时候该用、什么时候不该用✅适合运行时动态构造查询、紧急接口调试、快速原型验证、响应结构过于灵活不便于建模。❌不适合固定的业务查询、需要大量复用和代码补全的场景——这时类型安全才是 Ferry 的核心卖点应该回到代码生成的强类型请求。一句话总结JSON 操作逃生舱是 Plan B。代码生成能正常跑的时候强类型请求是首选但当它跑不起来JsonOperationRequest能保证你的 Dart GraphQL 项目不停摆。【免费下载链接】ferryStream-based strongly typed GraphQL client for Dart项目地址: https://gitcode.com/gh_mirrors/fer/ferry创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考