头图

GraphQL 快速入门【1】简介

【注】本文节译自:GraphQL - Quick Guide (tutorialspoint.com)

    GraphQL 是 Facebook 开发的一种开源服务器端技术,用于优化 RESTful API 调用。它是一种执行引擎和一种数据查询语言。在本章中,我们将讨论使用 GraphQL 的优势。

为什么使用 GraphQL

    RESTful API 遵循清晰且结构良好的面向资源的方法。但是,当数据变得更复杂时,路由会变得更长。有时无法通过单个请求获取数据。这就是 GraphQL 派上用场的地方。GraphQL 以图的形式构建数据,其强大的查询语法用于遍历、检索和修改数据。
    以下是使用 GraphQL 查询语言的优势:

询问你想要的 - 并得到它

    向您的 API 发送 GraphQL 查询并准确获取您需要的内容。GraphQL 查询总是返回可预测的结果。使用 GraphQL 的应用程序且稳定。与 Restful 服务不同,这些应用程序可以限制应该从服务器获取的数据。
    以下示例将帮助您更好地理解这一点:
    让我们考虑一个具有属性 idfirstNamelastNameCollegeName 的业务对象 Student。假设一个移动应用只需要获取 firstNameid。 如果我们设计一个像 /api/v1/students 这样的 REST 端点,它最终会为一个 Student 对象的所有字段获取数据。这意味着,数据被 RESTful 服务过度获取。 这个问题可以通过使用 GraphQL 来解决。
    考虑下面给出的 GraphQL 查询:

{
  {
    id
    firstName
  }
}

    这将仅返回 id 和 firstname 字段的值。该查询不会获取学生对象的其他属性的值。上面说明的查询的响应如下所示:

{
    "data": {
        "students": [
            {
                "id": "S1001",
                "firstName": "Mohtashim"
            },
            {
                "id": "S1002",
                "firstName": "Kannan"
            }
        ]
    }
}

在单个请求中获取多个资源

    GraphQL 查询有助于顺利检索关联的业务对象,而典型的 REST API 需要从多个 URL 加载。GraphQL API 在单个请求中获取您的应用程序所需的所有数据。即使在缓慢的移动网络连接上,使用 GraphQL 的应用程序也可以很快。
    让我们再考虑一个业务对象 College,它具有以下属性:名称和位置。 Student 业务对象与 College 对象具有关联关系。如果我们使用 REST API 来获取学生及其大学的详细信息,我们最终将向服务器发出两个请求,如 /api/v1/students/api/v1/colleges。这将导致每个请求的数据获取不足。 因此,移动应用被迫多次调用服务器以获取所需的数据。
    但是,移动应用可以使用 GraphQL 在单个请求中获取 Student 和 College 对象的详细信息。
    以下是用于获取数据的 GraphQL 查询:

{
  students {
    id
    firstName
    lastName
    college {
      name
      location
    }
  }
}

    上述查询的输出正好包含我们要求的那些字段,如下所示:

{
    "data": {
        "students": [
            {
                "id": "S1001",
                "firstName": "Mohtashim",
                "lastName": "Mohammad",
                "college": {
                    "name": "CUSAT",
                    "location": "Kerala"
                }
            },
            {
                "id": "S1002",
                "firstName": "Kannan",
                "lastName": "Sudhakaran",
                "college": {
                    "name": "AMU",
                    "location": "Uttar Pradesh"
                }
            },
            {
                "id": "S1003",
                "firstName": "Kiran",
                "lastName": "Panigrahi",
                "college": {
                    "name": "AMU",
                    "location": "Uttar Pradesh"
                }
            }
        ]
    }
}

描述类型系统的可能性

    GraphQL 是强类型的,查询基于字段及其关联的数据类型。如果 GraphQL 查询中存在类型不匹配,服务器应用程序会返回清晰且有用的错误消息。这有助于客户端应用顺利调试和轻松检测错误。 GraphQL 还提供了客户端库,可以帮助减少显式数据转换和解析。
    下面给出了 StudentCollege 数据类型的示例:

type Query {
  students: [Student]
}

type Student {
  id: ID!
  firstName: String
  lastName: String
  fullName: String
  college: College
}

type College {
  id: ID!
  name: String
  location: String
  rating: Float
  students: [Student]
}

使用强大的开发工具更快地响应

    GraphQL 为文档和测试查询提供了丰富的开发工具。GraphiQL 是一个出色的工具,可以生成查询及其模式的文档。 它还提供了一个查询编辑器,用于在构建查询时测试 GraphQL API 和智能代码完成功能。


技术人生
分享程序人生、播洒技术甘露。

“码”界老兵,分享程序人生。

54 声望
5 粉丝
0 条评论
推荐阅读
使用Spring Data Redis 发布订阅消息
使用 Spring Data Redis 发布订阅消息1. 概述在 Redis 中,发布者并没有将消息发送给特定的订阅者。是将发布的消息被划分为通道,并不知道会有哪些订阅者(如果有的话)。类似地,订阅者表示对一个或多个主题感兴趣...

信码由缰阅读 388

封面图
马斯克都不懂的 GraphQL,API 网关又能对其如何理解?
上个月马斯克评论 Twitter App 滥用 RPC 后,与一些 Twitter 的技术主管发生了矛盾 —— 直言马斯克不懂技术。那这个马斯克都不懂的 GraphQL 到底是什么?

Apache_APISIX1阅读 608

2023 新年好(顺便记 Flask 的 Bad request 错误)
如果你用 Flask 实现过 restful 的接口,可能经常会遇到发送 POST 请求的时候,返回 400 BAD REQUEST 的情况,这时候即使可以调试,也看不到更多的错误信息了,因为还没执行到自己的业务代码呢。这十有八九是因为...

songofhawk阅读 1.4k

封面图
技术阿里云实现ocr批量图片和pdf文件表格图片转换excel文档/支持票据图片提取/普通图片文字提取处理
支持pdf/图片/表格等格式文件装换成excel文件或其他格式文件首先,图片识别过程 {代码...} 接着,写出excel文件 {代码...} 最后,效果图更多具体功能实现微/电:16717696360

Jame阅读 774

封面图
到底什么样的 REST 才是最佳 REST?
说起 REST API,小伙伴们多多少少都有听说过,但是如果让你详细介绍一下什么是 REST,估计会有很多人讲不出来,或者只讲出来其中一部分。

Java架构师阅读 234

独立产品灵感周刊 DecoHack #045 - 新春程序员寻找“副业”灵感指南
本周刊记录有趣好玩的独立产品设计开发相关内容,每周发布,往期内容同样精彩,感兴趣的伙伴可以点击订阅我的周刊。为保证每期都能收到,建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。

ViggoZ

封面图

“码”界老兵,分享程序人生。

54 声望
5 粉丝
宣传栏