本文介绍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 的任何新代码,但需要来自客户端的描述预期响应的架构的新查询。

    下面有一个查询,它可以获取所有消息,但仅限它们的 idauthor 字段。 查询通知 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 变化的变量更改数据

    上述查询对 authorcontent 的值进行了硬编码。 不建议此方法,但可在此处用于说明请求中预期值的情况。 现在,你可以更改相同的变化请求以允许变量,并允许请求注入相应的值的客户端。

    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 开发