本文介绍GraphQL的基础知识,例如如何使用查询和突变在GraphQL服务器上检索和更改数据。 如果已熟悉GraphQL,可以继续阅读本系列中的下一篇文章。
GraphQL API 使客户端可以控制 API 结果
GraphQL 提供了一种查询语言,可用于以声明方式从服务器请求数据。 可以请求:
架构中所需的特定数据。 由 API 的架构定义中的客户端完成对数据架构的更改。
返回表示对象集合的嵌套架构中的数据,而不考虑需要多少个数据源。 将这与需要若干 API 请求来提供相同数据的典型 REST API 进行对比。
GraphQL 充当 API 终结点和数据库之间的层。 GraphQL 提供程序(如
Apollo
),提供生成 GraphQL API 所需的许多功能。 与大多数使用数据库的软件一样,提供程序无法为你编写实际的数据库查询,因为只有你知道自己的数据。 提供程序通常会生成许多样板代码以使用 GraphQL,因此你只需使用业务或中间件逻辑。
第一个 Apollo GraphQL API 查询
GraphQL 查询(从服务器请求值
hello
)看起来像 JSON,但不是真正的 JSON 对象:
hello
服务器通过 JSON 进行响应:
"hello":"Hello from GraphQL backend"
使用查询和变化读取和写入 Apollo GraphQL
在 GraphQL 中,使用查询和写入操作(例如插入和更新)通过变化对数据执行读取操作。
使用 Apollo GraphQL API 查询获取全部信息
假设有一个包含消息的数据源,每条消息有 ID、作者和内容。
若要查询所有消息,GraphQL 查询应如下所示:
getMessages {
content
author
API 终结点可能如下所示:
/api/graphql
,cURL 请求可能如下所示:
curl -X POST 'http://localhost:7071/api/graphql' \
-H 'content-type: application/json' \
--data-raw '{"query":"{ getMessages { id content author } }"}'
API 响应如下所示:
"data": {
"getMessages": [
"id": "d8732ed5-26d8-4975-98a5-8923e320a77f",
"author": "dina",
"content": "good morning"
"id": "33febdf6-e618-4884-ae4d-90827280d2b2",
"author": "john",
"content": "oh happy day"
使用客户端查询返回一部分数据
尽管前面的示例返回了每条消息和消息中的每个字段,但可能有时客户端知道它只需要某些字段。 这不需要 API 的任何新代码,但需要来自客户端的描述预期响应的架构的新查询。
下面有一个查询,它可以获取所有消息,但仅限它们的 id
和 author
字段。 查询通知 GraphQL 服务器不要将 content
的值发送到客户端:
getMessages {
author
API 终结点可能如下所示:/api/graphql
,cURL 请求可能如下所示:
curl -X POST 'http://localhost:7071/api/graphql' \
-H 'content-type: application/json' \
--data-raw '{"query":"{ getMessages { id author } }"}'
API 响应如下所示:
"data": {
"getMessages": [
"id": "d8732ed5-26d8-4975-98a5-8923e320a77f",
"author": "dina"
"id": "33febdf6-e618-4884-ae4d-90827280d2b2",
"author": "john"
通过变化更改数据
若要更改数据,请使用定义更改的变化,并定义从更改返回的数据内容。 假设你有一个包含消息的数据源(每条消息具有 ID、作者和内容),并且希望添加新的消息。
Apollo GraphQL 语法
若要添加新消息,GraphQL 变化应如下所示:
mutation {
createMessage(input: { author: "John Doe", content: "Oh happy day" }) {
请注意,最后一个大括号部分 { id }
描述了客户端在响应中需要的架构。
HTTP cURL 请求
API 终结点可能如下所示:/api/graphql
,cURL 请求可能如下所示:
curl 'http://localhost:7071/api/graphql' \
-X POST \
-H 'Content-Type: application/json' \
--data-raw '{"query": "mutation{ createMessage(input: { author: \"John Doe\", content: \"Oh happy day\" }){ id } }"}'
HTTP 响应
API 响应如下所示:
"data": {
"createMessage": {
"id":"7f1413ec-4ffa-45bc-bce2-583072745d84"
使用用于 Apollo 变化的变量更改数据
上述查询对 author
和 content
的值进行了硬编码。 不建议此方法,但可在此处用于说明请求中预期值的情况。 现在,你可以更改相同的变化请求以允许变量,并允许请求注入相应的值的客户端。
HTTP cURL 请求正文
若要传递变量,请通过 variables
属性发送它们。 在变化参数中使用 $
和与变化所需的内容匹配的类型(如 String!
)来描述变量。 然后,根据需要将它们分配给变化参数。
"variables": { "author": "jimbob", "content": "sunny in the `ham" },
"query": "mutation ($author: String!, $content: String!) { createMessage(input: { author: $author, content: $content }){ id }}"
cURL 请求
以下请求正文 --data-raw
值已去除所有格式。
curl 'http://localhost:7071/api/graphql' \
-X POST \
-H 'Content-Type: application/json' \
--data-raw '{"variables": { "author": "jimbob", "content": "sunny in the `ham" },"query": "mutation ($author: String!, $content: String!){ createMessage(input: { author: $author, content: $content }){ id } }"}'
本地 TypeScript 开发