新闻详情

新闻详情

首页 / 资讯中心 / 详情

使用 Scala 与 Sangria 构建 GraphQL 服务器:技术选型、Schema 驱动开发与共享 Schema 全解析

发布时间:2026/9/25 11:20:33来源:尧图网络
使用 Scala 与 Sangria 构建 GraphQL 服务器:技术选型、Schema 驱动开发与共享 Schema 全解析
【免费下载链接】howtographqlThe Fullstack Tutorial for GraphQL项目地址https://gitcode.com/gh_mirrors/ho/howtographql点击查看免费下载本指南是 howtographql 仓库中 GraphQL Scala 后端教程的开篇对应 content/backend/graphql-scala/0-introduction.md系统讲解为什么选择 Scala 技术栈实现 GraphQL 服务器、GraphQL 服务器的核心职责以及贯穿整个教程的 Schema 驱动开发方法论与共享数据模型。读完本文你将掌握 GraphQL 服务器的基本工作原理理解本教程后续章节将要实现的完整 Schema查询、变更、订阅、类型、输入类型与枚举并能在此基础上接入任意 HowToGraphQL 前端示例。为什么选择 Scala 构建 GraphQL 后端Scala 如今是一门非常流行的语言常被选用于构建高效且可扩展的系统。它运行在 Java 虚拟机上继承了 JVM 久经考验的可靠性与健壮性同时它对函数式编程的原生支持、丰富的生态和稳定的基础使得开发者能够快速构建出高性能的应用。在本教程中我们将使用以下技术栈搭建 GraphQL 服务器技术角色Scala服务器开发语言Akka HTTP处理 HTTP 请求的 Web 服务器Sangria负责 GraphQL 查询解析与执行的库Slick数据库查询与访问库H2 Database内存数据库无需额外安装即可运行GraphiQL浏览器端的 GraphQL 交互式控制台便于调试Giter8Scala 项目模板生成工具用于快速初始化工程这一技术栈的每一环都承担明确职责Akka HTTP 提供异步、非阻塞的 HTTP 层Sangria 负责把 GraphQL 查询文本解析成 AST 并执行解析器resolverSlick 以类型安全的方式访问数据库H2 则以零配置的内存模式支撑本地开发与演示GraphiQL 让开发者直接在浏览器中编写和调试查询。本教程假设你已经熟悉 GraphQL 的核心概念如果还不熟悉可以先阅读仓库中 content/graphql/basics/ 下的基础章节。什么是 GraphQL 服务器一个 GraphQL 服务器应当具备以下四项核心能力1. 接收符合 GraphQL 格式的请求。客户端把查询以 JSON 形式 POST 到服务器例如{ query: query { allLinks { url } } }2. 连接一个或多个数据源如数据库或其他 API并按要求格式化获取到的信息。GraphQL 的数据获取天然是按需取数的客户端声明需要哪些字段服务器就只返回这些字段。3. 响应请求数据。例如{ data: { allLinks: { url: http://graphql.org/ } } }4. 依据 Schema 定义校验传入的请求与支持的格式。例如当查询中出现了未知字段时服务器应返回如下形式的错误{ errors: [{ message: Cannot query field \unknown\ on type \Link\. }] }可以看到这里演示的服务器实现非常简单但真实的 GraphQL 实现能做的事情远不止这些——本教程后续章节查询、参数、延迟解析、自定义标量、接口、关系、变更、鉴权正是逐步把这些能力补全的过程。Schema 驱动开发让前后端并行演进Schema 优先Schema-first的 GraphQL 开发方式要求前后端开发者在开工前就确定一份严格的契约即 Schema从而让双方在遵守规范的前提下快速、高效地并行工作。它既能提升 API 的性能表现也能提升团队整体的开发效率。因此构建 GraphQL 服务器的经验通常始于 Schema 的设计与编写核心工作流程可以概括为三步循环定义类型并为它们设计合适的查询Query与变更Mutation实现解析器Resolver按照已定义的类型执行约定的查询逻辑当新需求到来时回到第 1 步更新 Schema并继续推进其余步骤。Schema 是前后端之间的契约把它置于开发过程的中心可以使两端在不偏离规范的前提下各自演化也更容易并行分工前端从一开始就完整知晓 API 的形状可以先用简单的 Mock 服务甚至是 Graphcool 之类的完整后端推进开发之后无缝替换为最终实现的服务器。教程目标实现一份全教程共享的 SchemaHowToGraphQL 的绝大多数教程都基于同一份 Schema。我们的目标是运行一个支持该 Schema 的 Scala 服务器这样你可以任选一个前端示例直接连接到我们的服务器上。该 Schema 的完整定义保存在仓库的 meta/structure.graphql 中它是贯穿本教程以及各前端教程的权威契约完整内容如下type Query { allLinks(filter: LinkFilter, orderBy: LinkOrderBy, skip: Int, first: Int): [Link!]! _allLinksMeta: _QueryMeta! } type Mutation { signinUser(email: AUTH_PROVIDER_EMAIL): SigninPayload! createUser(name: String!, authProvider: AuthProviderSignupData!): User createLink(description: String!, url: String!, postedById: ID): Link createVote(linkId: ID, userId: ID): Vote } type Subscription { Link(filter: LinkSubscriptionFilter): LinkSubscriptionPayload Vote(filter: VoteSubscriptionFilter): VoteSubscriptionPayload } interface Node { id: ID! } type User implements Node { id: ID! isUnique createdAt: DateTime! name: String! links: [Link!]! relation(name: UsersLinks) votes: [Vote!]! relation(name: UsersVotes) email: String isUnique password: String } type Link implements Node { id: ID! isUnique createdAt: DateTime! url: String! description: String! postedBy: User! relation(name: UsersLinks) votes: [Vote!]! relation(name: VotesOnLink) } type Vote implements Node { id: ID! isUnique createdAt: DateTime! user: User! relation(name: UsersVotes) link: Link! relation(name: VotesOnLink) } input AuthProviderSignupData { email: AUTH_PROVIDER_EMAIL } input AUTH_PROVIDER_EMAIL { email: String! password: String! } input LinkSubscriptionFilter { mutation_in: [_ModelMutationType!] } input VoteSubscriptionFilter { mutation_in: [_ModelMutationType!] } input LinkFilter { OR: [LinkFilter!] description_contains: String url_contains: String } type SigninPayload { token: String user: User } type LinkSubscriptionPayload { mutation: _ModelMutationType! node: Link updatedFields: [String!] } type VoteSubscriptionPayload { mutation: _ModelMutationType! node: Vote updatedFields: [String!] } enum LinkOrderBy { createdAt_ASC createdAt_DESC } enum _ModelMutationType { CREATED UPDATED DELETED } type _QueryMeta { count: Int! } scalar DateTime解析这份共享 Schema这份 Schema 定义了 HackerNews 风格示例应用的完整数据模型理解它有助于把握后续每一章的实现目标Query根类型暴露allLinks支持filter、orderBy、skip、first参数分别对应过滤、排序与分页以及_allLinksMeta用于获取记录总数返回_QueryMeta.count。Link使用[Link!]!的非空列表声明表示字段本身和列表元素都不可为空。Mutation根类型提供signinUser邮箱密码登录返回含token与user的SigninPayload、createUser、createLink与createVote四个变更操作。其中AuthProviderSignupData、AUTH_PROVIDER_EMAIL是input关键字声明的输入类型——input与type不同它只能作为参数使用。Subscription根类型Link与Vote订阅支持通过mutation_in过滤监听的事件类型CREATED、UPDATED、DELETED订阅载荷包含mutation、node与updatedFields。Node接口与实现User、Link、Vote都实现Node接口要求提供id: ID!这是 GraphQL 中表达可唯一标识对象的惯用方式。三个类型上标注的isUnique、relation指令描述了数据约束与实体间关系如User.links与Link.postedBy通过UsersLinks关联Vote通过VotesOnLink关联到Link。LinkFilter输入类型支持OR逻辑组合、description_contains与url_contains子串过滤这是后续过滤与排序章节的基础。LinkOrderBy枚举只提供createdAt_ASC与createdAt_DESC两种排序方向。scalar DateTime自定义标量。GraphQL 内置标量不包含日期时间类型需要在服务器端自行实现序列化与解析——这在教程自定义标量章节中有完整演示。从 Schema 到可运行服务器的路线图明确了目标 Schema 之后本教程接下来的章节将逐步把这份契约实现为可运行的服务器入门与项目初始化使用 Giter8 模板sbt new marioosh/howtographql-scala-sangria.g8初始化 SBT 工程搭建 Akka HTTP 服务器默认端口 8080并通过application.conf配置 H2 内存数据库jdbc:h2:mem:howtographqldb。第一个查询定义Link模型、建立 Slick 表映射与种子数据引入 Sangria 的QueryParser与Executor实现GraphQLServer与GraphQLSchema并暴露/graphql端点与 GraphiQL 控制台。处理参数为查询增加id、ids等参数并给出提取参数并传入解析器的模式。延迟解析与 Fetcher用Fetcher对按 ID 取数的查询做批量加载、去重与缓存配合HasId类型类避免 N1 查询。自定义标量为createdAt字段实现DateTime标量打通类型 → String → 类型的双向转换与Violation错误处理。接口新增User、Vote模型抽取公共Identifiabletrait 与 GraphQLInterfaceType统一HasId实现。关系通过Relation与Fetcher.rel实现User.links、Link.postedBy、Vote.user、Vote.link等关联查询用deferRelSeq批量解析关联实体。变更为createUser、createLink、createVote定义InputObjectType、FromInput类型类与 DAO 写入逻辑并将Mutation接入Schema(QueryType, Some(Mutation))。认证与授权用FieldTag标记受保护字段、Middleware拦截请求、ExceptionHandler统一转换认证/授权异常并借助MyContext携带登录用户状态实现login变更。小结本章明确了整个 Scala 教程的四大支柱技术选型Scala Akka HTTP Sangria Slick H2、服务器职责接收请求、连接数据源、按需响应、按 Schema 校验、开发方法论Schema 优先、前后端并行以及共享目标 Schemameta/structure.graphql 中的完整契约。这份 Schema 既是后续每一章的实现清单也是连接 HowToGraphQL 全部前端教程的公共接口。理解了它你就可以带着清晰的目标进入下一章从初始化 SBT 工程开始搭建自己的 GraphQL 服务器。赞分享【免费下载链接】howtographqlThe Fullstack Tutorial for GraphQL项目地址https://gitcode.com/gh_mirrors/ho/howtographql点击查看免费下载相关推荐GenVideoPython驱动的智能视频自动化生成引擎GenVideoPython驱动的智能视频自动化生成引擎 在内容创作日益数字化的时代视频已成为信息传播的核心载体。然而传统视频制作流程复杂、耗时耗力让许3步学会.NET程序分析工具配置管理打造你的个性化调试环境3步学会.NET程序分析工具配置管理打造你的个性化调试环境 你是否曾经为每次打开.NET程序分析工具都要重新设置一遍调试参数而烦恼 作为.NET开发者和使用 Prisma 进行 GraphQL Server 开发Schema、Resolver 与 GraphQL Binding 全解析使用 Prisma 进行 GraphQL Server 开发Schema、Resolver 与 GraphQL Binding 全解析 details s后端数据库GraphQL上一篇OpenPLC Editor完全指南3步搞定免费工业自动化编程下一篇ExplorerPatcher终极Windows 11界面定制方案专业级系统增强工具深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Prompt4Trust: A Reinforcement Learning Prompt Augmentation Framework for Clinically-Aligned Confi... 2026/9/25 12:59:18

Prompt4Trust: A Reinforcement Learning Prompt Augmentation Framework for Clinically-Aligned Confi...

文章主要内容和创新点 主要内容 本文介绍了Prompt4Trust,这是首个基于强化学习(RL)的提示增强框架,旨在解决多模态大型语言模型(MLLMs)在临床场景中部署的关键问题:对提示设计的敏感性以及高置信度下的错误响应。该框架通过训练一个轻量级的校准指导提示(CGP)生成器…

阅读更多 →
Windows Universal 平台自定义串口设备访问:基于 Windows.Devices.SerialCommunication 的 UWP 串口通信完整实战 2026/9/25 12:59:12

Windows Universal 平台自定义串口设备访问:基于 Windows.Devices.SerialCommunication 的 UWP 串口通信完整实战

示例工程 【免费下载链接】Windows-universal-samples API samples for the Universal Windows Platform. 项目地址: https://gitcode.com/gh_mirrors/wi/Windows-universal-samples 点击查看 免费下载 本文以 Windows-universal-samples 仓库中 CustomSerialDevic…

阅读更多 →
Atlas 300V 24G AI 推理加速卡部署 YOLO 全流程指南 2026/9/25 12:59:05

Atlas 300V 24G AI 推理加速卡部署 YOLO 全流程指南

最近被问到最多的两个问题,一个是“Atlas 300V 24G 是运算加速卡吗”,另一个是“这卡能不能部署YOLO”。这两个问题其实可以合成一个问题:这张卡到底该拿来做什么、怎么把它用起来。Atlas 300V 24G 是华为昇腾系列里面向 AI 推理场景的 PCIe …

阅读更多 →
1602LCD显示扩展lcd-1602-display完全介绍:3个积木点亮你的第一块字符屏 2026/9/25 12:58:59

1602LCD显示扩展lcd-1602-display完全介绍:3个积木点亮你的第一块字符屏

1602LCD显示扩展lcd-1602-display完全介绍:3个积木点亮你的第一块字符屏 【免费下载链接】lcd-1602-display 源师兄扩展项目: 1602LCD | 由源师兄组织创建 项目地址: https://gitcode.com/yuanshixiong/lcd-1602-display lcd-1602-display 是源师兄组织出品的…

阅读更多 →
5 分钟完成接入!OpenClaw 搭配 DeepSeek V4,模型切换一步到位(TaoToken 统一 Key 配置) 2026/9/25 12:58:53

5 分钟完成接入!OpenClaw 搭配 DeepSeek V4,模型切换一步到位(TaoToken 统一 Key 配置)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
从视频生成到三维高斯重建:minimaxH3多视角采集实战 2026/9/25 12:58:34

从视频生成到三维高斯重建:minimaxH3多视角采集实战

前阵子我在做一个小场景的三维重建项目,数据采集环节卡了很久——拍摄设备不够、光线来回变、物体表面又是反光材质,怎么拍都不理想。后来偶然试了一下用minimaxH3生成360度定格旋转视频,再把关键帧提取出来做多视角数据采集,配合…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉