接上篇 —— 如何使用 GraphQL-进阶教程:安全 —— 继续翻译How to GraphQL 系列教程。
回答有关服务端缓存,身份验证,授权,错误处理,离线使用等的常见 GraphQL 问题。
基础和进阶系列翻译已完成:
GraphQL 是数据库技术吗?
不是。GraphQL 经常会与数据库技术混淆。这是一个误解,GraphQL 是 API(而非数据库)的 查询语言(query language) 。从这个意义上说,它与数据库无关,可以与任何类型的数据库一起使用,甚至可以根本不使用任何数据库。
GraphQL 仅适用于 React / Javascript 开发人员吗?
不是。GraphQL 是一种 API 技术,因此可以在需要 API 的任何环境中使用。
在 服务端(backend) 上,可以使用可用于构建 Web 服务器的任何编程语言来实现 GraphQL 服务。除了 Javascript 之外,还有流行的 Ruby、Python、Scala、Java、Clojure、Go 和.NET 的参考实现。
由于 GraphQL API 通常是通过 HTTP 操作的,因此任何使用 HTTP 交流的客户端都可以从 GraphQL 服务器查询数据。
注意:GraphQL 实际上与传输层无关,因此也可以选择 HTTP 以外的协议来实现服务。
如何进行服务器端缓存?
尤其是与 REST 比较时,GraphQL 的一个常见问题是维护服务端缓存比较困难。使用 REST,可以轻松地为每个端点缓存数据,因为可以确保数据的 结构(structure) 不会改变。
另一方面,使用 GraphQL 不清楚客户端下一步将要请求什么,因此将缓存层放在 API 后面没有意义不大。
使用 GraphQL,服务端缓存仍然是一个挑战。有关缓存的更多信息,请参见GraphQL 网站。
如何进行身份验证和授权?
身份验证和授权通常很混乱。身份验证(Authentication) 描述声明 (身份)identity 的过程。当使用用户名和密码登录服务并进行身份验证时,便会执行此操作。另一方面,授权(Authorization) 描述了 权限规则(permission rules) ,该规则指定了单个用户或用户组对系统某些部分的访问权限。
可以使用OAuth等常见模式来实现 GraphQL 中的身份验证。
为了实现授权,推荐将所有数据访问逻辑委托给业务逻辑层,而不是直接在 GraphQL 实现中处理它。如果想学习如何实现授权,可以看看Graphcool’s permission rules。
如何处理错误?
成功的 GraphQL 查询应该返回一个带有名为 "data"
的根字段的 JSON 对象。如果请求失败或部分失败(例如,由于请求数据的用户没有正确的访问权限),则会在响应中添加另一个名为 "errors"
的根字段:
1 | { |
有关更多的详细信息,可以参考GraphQL 规范。
GraphQL 是否支持离线使用?
GraphQL 是(Web)API 的查询语言,从定义上讲仅可在线使用。但是,对客户端的离线支持是一个值得思考的问题。对于某些用法,Relay 和 Apollo 的缓存功能可能已经足够,但是还没有一种用于实际持久存储数据的流行解决方案。可以在Relay和Apollo的 GitHub issues 中获得更多的见解,其中讨论了离线支持。
可以找到一种有趣的离线使用和持久性方法。
前端记事本,不定期更新,欢迎关注!