GraphQL 简介

简介



随着 Web 和移动应用程序变得越来越成熟和复杂,软件工程师发明了巧妙的新方法来改善应用程序中客户端和服务器之间的交互。在过去的几年里,在这方面最大的范式转变之一是 GraphQL,一种用于操作 API 的开源查询语言和运行时。GraphQL 由 Facebook 于 2012 年设计(并于 2015 年公开发布),旨在通过制作一个声明式、客户端驱动和高性能的新系统来解决传统 REST 架构的各种弱点。

在本文中,您将了解 GraphQL 是什么,熟悉 GraphQL 的重要术语和概念,并发现 GraphQL 规范与 REST 架构风格相比如何。

GraphQL 是什么?

GraphQL 代表图形查询语言,但与其他查询语言(如 SQL(结构化查询语言))不同,它不是一种直接与数据库通信的语言,而是一种定义客户端与 API 服务器通信的契约的语言。GraphQL 规范是一个描述语言规则和特征的开放标准。它还提供了执行 GraphQL 查询的说明。

由于 GraphQL 是由开放标准定义的,因此没有正式的 GraphQL 实现。GraphQL 实现可以使用任何编程语言编写,与任何类型的数据库集成,并支持任何客户端(例如移动或 Web 应用程序),只要它遵循规范中概述的规则即可。最流行的商业 GraphQL 实现之一是 Apollo GraphQL,它吹捧了几个 GraphQL 客户端和服务器实现,但没有必要使用 Apollo 来使用或理解 GraphQL。

GraphQL 特性

GraphQL 设计有几个关键特征。GraphQL 查询是声明性和分层的,而 GraphQL 模式是强类型和内省的。

Declarative 声明

GraphQL 查询是声明性的,这意味着客户端将准确声明它感兴趣的字段,并且响应将仅包含这些属性.

此示例针对假设的幻想游戏 API 的 GraphQL 查询请求 ID 为“1”的向导,并请求该对象的名称和种族字段。

{
  wizard(id: "1") {
    name
    race
  }
}

以 JSON 格式返回的响应将返回一个数据对象,其中包含找到的向导对象,其中包含查询请求的两个字段。

{
  "data": {
    "wizard": {
      "name": "Merlin",
      "race": "HUMAN"
    }
  }
}

由于 GraphQL 响应只为您提供所需的确切信息,因此与始终提供完整数据集的替代方案相比,它会产生更高效、性能更高的网络请求。

Hierarchical 层次

GraphQL 查询也是分层的。返回的数据遵循查询的形状。在此示例中,查询已扩展为包括法术,并请求每个法术的名称和攻击字段。

{
  wizard(id: "1") {
    name
    spells {
      name
      attack
    }
  }
}

响应现在将包括与此特定向导关联的所有拼写对象的数组。尽管向导和咒语可能存储在单独的数据库表中,但它们可以通过单个 GraphQL 请求获取。(但是,GraphQL 对数据本身的存储方式并不固执己见,所以这是一个假设。

{
  "data": {
    "wizard": {
      "name": "Merlin",
      "spells": [
        {
          "name": "Lightning Bolt",
          "attack": 2
        },
        {
          "name": "Ice Storm",
          "attack": 2
        },
        {
          "name": "Fireball",
          "attack": 3
        }
      ]
    }
  }
}

Strongly-typed 强类型

GraphQL 是强类型,如 GraphQL Type 系统所述。类型描述了 GraphQL 服务器中值的功能。大多数程序员都熟悉 GraphQL 类型,具有字符串、布尔值和数字整数等标量(基元值),以及对象等更高级的值。

本示例创建一个拼写对象类型,其中包含与字符串和 Int 标量类型对应的字段。

type Spell {
  name: String!
  attack: Int
  range: Int
}

GraphQL 模式是使用类型系统定义的,它允许服务器在尝试查询数据之前确定查询是否有效。GraphQL 验证确保请求在语法上正确、明确且无错误。

Self-documenting 自我记录样式

内省功能允许 GraphQL 客户端和工具查询 GraphQL 服务器以获取底层模式的形状和数据。这允许创建诸如 GraphiQL、用于处理 GraphQL 查询的浏览器内 IDE 和游乐场等工具,以及其他用于自动生成文档的工具。

例如,您可以通过__schema通过此自省功能了解有关咒语类型的更多信息。

{
  __schema {
    types {
      name
      kind
      description
    }
  }
}

响应也将像任何其他 GraphQL 响应一样是 JSON。

{
  "data": {
    "__schema": {
      "types": [
        {
          "name": "Spell",
          "kind": "OBJECT",
          "description": "A powerful spell that a wizard can read from a scroll."
        }
      ]
    }
  }
}

Client-driven 客户端驱动

开发 GraphQL API 的工作发生在后端,其中模式是定义和实现的。但是,由于 GraphQL API 的所有功能都包含在服务器上的单个端点中,因此由客户端通过声明性查询来决定它到底需要哪些数据。这使开发人员能够快速迭代,因为前端开发人员可以继续查询 GraphQL API 公开的数据,而无需执行任何其他后端工作。

Architecture 架构

GraphQL 存在于客户端和数据之间的应用层中。GraphQL 服务器描述 API 中公开的功能,客户端描述请求的要求。

Server 服务端

GraphQL API 由单个端点定义,通常是 /graphql 端点,可以访问 GraphQL 服务器的全部功能。由于 GraphQL 是一种应用层技术并且与传输无关,因此它可以通过任何协议提供服务,但最常见的是通过 HTTP 提供。

GraphQL 服务器实现可以使用任何编程语言编写,例如 express-graphql 中间件,它允许您在 Node/Express HTTP 服务器上创建 GraphQL API。GraphQL 也是与数据库无关的,应用程序的数据可以存储在 MySQL、PostgreSQL、MongoDB 或任何其他数据库中。数据甚至可以由多个传统 REST API 端点的聚合提供。重要的是数据是在 GraphQL 模式中定义的,该模式通过描述可供查询的数据来定义 API。

Client 客户端

向 GraphQL 服务器发出的请求称为文档,由查询(用于读取请求)和突变(用于写入请求)等操作组成。

虽然有高级的 GraphQL 客户端,如 Apollo Client 或 Facebook 的 Relay,它们提供了缓存机制以及额外的工具,但不需要特殊的客户端来向 GraphQL 服务器发出请求。一个简单的 XMLHttpRequest 或从 Web 浏览器获取就足以通过将 GraphQL 文档发送到 GraphQL 服务器来发出请求。

下面是一个到 /graphql 端点的获取请求示例,该端点将 GraphQL 文档作为字符串传递到 POST 请求的正文中。

async function fetchWizards() {
  const response = await fetch('/graphql', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      query: `{
    wizards {
      id
      name
    },
  }`,
    }),
  })
  const wizards = await response.json()

  return wizards
}

fetchWizards()

这将返回请求的 JSON 响应。

{
  "data": {
    "wizards": [
      { "id": "1", "name": "Merlin" },
      { "id": "2", "name": "Gandalf" }
    ]
  }
}

GraphQL vs. REST

GraphQL 和 REST 不是可互换的概念,但它们解决了类似的应用程序问题。REST代表具象状态传输,是一种用于在不同系统之间共享数据的软件架构风格。RESTful API 是遵循 REST 原则和约束的 API,包括无状态、可缓存、在客户端和服务器之间强制分离关注点,以及具有统一的接口(例如通过 URI)。如前所述,GraphQL 是用于执行查询的查询语言和运行时的规范。

这两个系统都有优点和缺点,并且在现代 API 开发中都有其用途。然而,GraphQL 的开发是为了对抗 REST 系统的一些弱点,并创建一个更高效的、客户端驱动的 API。

这个列表并没有涵盖 REST 和 GraphQL 之间的所有异同,但总结了许多最关键的点。此外,GraphQL 可以用作聚合多个 REST 端点或服务的网关,在这种情况下,这两种技术可以并排使用。

特征

GraphQL

REST

描述

GraphQL 是一种用于 API 的查询语言,也是服务器端运行时

用于设计 Web 服务的体系结构样式

Data Fetching获取数据

响应确定性查询的单个 HTTP 终结点

一组通常返回预定数据集的 HTTP 终结点

Versioning

版本管理

不鼓励版本控制

常见版本控制

HTTP状态码

所有响应(包括错误)通常为 200

实现 HTTP 状态代码

Validation

内置元数据验证

必须手动实施验证

Documentation

内置过孔类型系统和自省

不是自我记录的,像OpenAPI这样的工具可用

Caching

缓存

请求方法

查询、更改和订阅(通过 HTTP 的 POST )

使用的所有HTTP方法(GET,POST,PATCH,PUT,DELETE等)

响应内容类型

JSON

Any (JSON, XML, HTML, etc.)

总结

GraphQL 是一种开源查询语言和 API 运行时。GraphQL 由 Facebook 的开发人员发明,旨在通过为 API 制作客户端驱动的声明性查询语言来解决传统 REST API 遇到的各种问题,例如获取数据过多/不足和网络请求效率低下。

虽然 GraphQL 不是与 REST 互换的概念,但它们都描述了管理客户端和服务器之间通信的不同方法。在本文中,您了解了 GraphQL 是什么,GraphQL 和 REST 之间的主要区别和相似之处,以及 GraphQL 服务器如何向客户端公开数据。

展开阅读全文

页面更新:2024-04-01

标签:缓存   客户端   定义   对象   声明   类型   版本   语言   服务器   简介   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top