GraphQL - 简介介绍 首页GraphQLGraphQL - 简介

GraphQL是一个开源的,面向API而创造出来的数据查询操作语言以及相应的运行环境。 于2012年仍处于Facebook内部开发阶段,直到2015年才公开发布。 2018年11月7日,Facebook将GraphQL项目转移到新成立的GraphQL基金会(隶属于非营利性的Linux基金会)。

GraphQL相较于REST以及其他web service架构提供了一种更加高效、强大和灵活的开发web APIs的方式。它通过由客户端根据所需定义数据结构,同时由服务端负责返回相同数据结构的对应数据的方式避免了服务端大量冗余数据的返回,但与此同时也意味着这种方式不能有效利用起查询结果的web缓存。GraphQL这种查询语言所带来的灵活性和丰富性的同时也增加了复杂性,导致简单的APIs有可能并不适合这种方式。

GraphQL支持数据读取、写入(操作)和数据变更订阅(实时更新)。

主要的GraphQL客户端有Apollo Client 和 Relay.GraphQL的服务端在多个语言都有实现包括Haskell, JavaScript, Python,[11] Ruby, Java, C#, Scala, Go, Elixir,[12] Erlang, PHP, R,和 Clojure.

2018年2月9日GraphQL的部分模式定义语言(SDL)规范制定完成。

GraphQL优势

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

以下示例将帮助您更好地理解这一点-

让我们考虑具有属性 id,firstName,lastName 和 collegeName 的业务对象 Student 。假设移动应用程序仅需要获取 first 和 id 。如果我们设计像/api/v1/students 这样的REST端点,它将最终为 student对象的所有字段获取数据。这意味着,RESTful服务会过度获取数据。通过使用GraphQL可以解决此问题。

考虑下面给出的GraphQL查询-

{
   students {
      id
      firstName
   }
}

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

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

单个请求获得更多资源

GraphQL查询有助于平滑检索关联的业务对象 ,而典型的REST API需要从多个URL进行加载。 GraphQL API在单个请求中获取应用程序需要的所有数据。

让我们再考虑一个具有以下属性的业务对象 College :name和location。 Student 业务对象 与College对象具有关联关系。如果要使用REST API来获取学生及其所在大学的详细信息,我们最终将向服务器发出两个请求,如/api/v1/students 和/api/v1 /college。移动应用程序被迫多次调用服务器以获取所需的数据。

但是,移动应用程序可以使用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还提供了客户端库,可以帮助减少显式数据转换和解析。

下面给出了 Student 和 College 数据类型的示例-

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]
}
点我分享笔记