2024-10-23
想象一下你在网上订餐。你浏览菜单,选择你的菜品,然后点击“下单”。眨眼之间,你的订单通过服务器、厨房和送货员的网络到达你手中。这种流畅的体验依赖于 APIs - 应用程序编程接口 - 这些无形的信使允许网站或应用程序的不同部分进行通信。
但让我们聚焦于一种特定类型的 API:GraphQL。
超越 REST 的世界
虽然 REST APIs 像餐厅一样拥有固定的菜单(GET 用于读取,POST 用于创建,PUT 用于更新,DELETE 用于删除),但 GraphQL 更像是一份定制的餐点。你指定你需要哪些信息,服务器只回送这些信息,没有任何多余的东西。
GraphQL 查询和突变:构建你的 API 餐点
假设你在为一家名为“书虫天堂”的虚拟书店建立一个网站。用户想浏览书籍、查看他们的愿望清单并购买新书。这就是 GraphQL 发挥作用的地方:
查询: 想象一下,一位用户想要看到所有出版于 2020 年以后的奇幻小说。在 GraphQL 中,他们会使用这样的查询:
query {
books(genre: "Fantasy", publicationYear: { greaterThan: 2020 }) {
title
author
publicationYear
}
}
这个查询明确指定了所需的数据 - 所有出版于 2020 年以后的奇幻小说的标题、作者和出版年份。服务器只回送这些信息,没有任何其他内容。
突变: 现在,假设一位用户想要将“风的名字” (The Name of the Wind) 作者帕特里克·罗瑟福斯添加到他们的愿望清单中。他们会使用这样的突变:
mutation {
addBookToWishlist(bookId: "b1234") {
id
books {
title
}
}
}
这个突变指示服务器将 ID 为“b1234” 的书籍添加到用户的愿望清单中。它还返回更新后的愿望清单信息。
GraphQL 的强大之处:
GraphQL 使开发人员能够为现代 Web 应用构建强大且高效的 API,为用户像我们的“书虫天堂”购物者提供无缝体验。
例如,如果你使用 Spotify 这样的音乐流媒体服务。
传统的 REST API 方法:
/api/playlists/current
。这会返回一个巨大的 JSON 对象,包含关于你的播放列表的所有信息:标题、描述、歌曲(每首歌曲都有其自身详尽的数据)、用户信息等等。即使你只想查看歌曲标题,你也仍然会获得所有这些额外数据。GraphQL 解决方案:
query {
currentPlaylist {
tracks {
title
}
}
}
Spotify 服务器只会返回你播放列表中每一首歌的 title
字段,节省带宽和处理时间。
好处:
query {
currentPlaylist {
tracks {
title
artist {
name
}
}
}
}
这就是 GraphQL 如何使您与网站和应用程序的交互更加高效和满足您需求的一个例子。
## REST API vs. GraphQL
特性 | REST API | GraphQL |
---|---|---|
数据结构 | 预设菜单(GET, POST, PUT, DELETE) | 自定义请求 (查询和突变) |
数据返回 | 返回整个资源,即使只请求部分信息 | 只返回请求的特定信息 |
效率 | 可能返回多余的数据,增加带宽消耗 | 只返回必要数据,提高效率 |
灵活性 | 需要多个请求获取不同数据 | 一个请求获取所需所有数据 |
控制 | 数据结构由服务器定义 | 开发者定义数据结构和返回格式 |
总结: GraphQL 更灵活、高效且容易控制返回的数据,使其成为现代 Web 应用的强大选择。