GraphQL 是由 Facebook 创造的用于描述复杂数据模型的一种查询语言。这里查询语言所指的并不是常规意义上的类似 sql 语句的查询语言,而是一种用于前后端数据查询方式的规范

Restful的不足

GraphQL的优势

查询规范

字段

在GraphQL的查询中,请求结构中包含了所预期结果的结构,这个就是字段。并且响应的结构和请求结构基本一致

{  hero {    name  }}
{  "data": {    "hero": {      "name": "R2-D2"    }  }}

参数

语法:(参数名:参数值)

{  human(id: "1000") {    name    height  }}
{  "data": {    "human": {      "name": "Luke Skywalker",      "height": 1.72    }  }}

别名

如果一次查询多个相同对象,但是值不同,这个时候就需要起别名了,否则json的语法就不能通过了

{  empireHero: hero(episode: EMPIRE) {    name  }  jediHero: hero(episode: JEDI) {    name  }}
{  "data": {    "empireHero": {      "name": "Luke Skywalker"    },    "jediHero": {      "name": "R2-D2"    }  }}

片段

查询对的属相如果相同,可以采用片段的方式进行简化定义

{  leftComparison: hero(episode: EMPIRE) {    ...comparisonFields  }  rightComparison: hero(episode: JEDI) {    ...comparisonFields  }}fragment comparisonFields on Character {  name  appearsIn  friends {    name  }}
{  "data": {    "leftComparison": {      "name": "Luke Skywalker",      "appearsIn": [        "NEWHOPE",        "EMPIRE",        "JEDI"      ],      "friends": [        {          "name": "Han Solo"        },        {          "name": "Leia Organa"        },        {          "name": "C-3PO"        },        {          "name": "R2-D2"        }      ]    },    "rightComparison": {      "name": "R2-D2",      "appearsIn": [        "NEWHOPE",        "EMPIRE",        "JEDI"      ],      "friends": [        {          "name": "Luke Skywalker"        },        {          "name": "Han Solo"        },        {          "name": "Leia Organa"        }      ]    }  }}

Schema

Schema 是用于定义数据结构的,比如说,User对象中有哪些属性,对象与对象之间是什么关系等

schema { #定义查询     query: UserQuery }type UserQuery { #定义查询的类型     user(id:ID) : User #指定对象以及参数类型 }type User {#定义对象     id:ID! # !表示该属性是非空项     name:String age:Int }

类型规范

标量类型

枚举类型

枚举类型是一种特殊的标量,它限制在一个特殊的可选值集合内

enum Episode { # 定义枚举  NEWHOPE  EMPIRE  JEDI}type Character { # 使用枚举  name: String!  appearsIn: [Episode]!}

接口

跟许多类型系统一样,GraphQL 支持接口。一个接口是一个抽象类型,它包含某些字段,而对象类型必须包含这些字段,才能算实现了这个接口

interface Character {  id: ID!  name: String!  friends: [Character]  appearsIn: [Episode]!}type Human implements Character {  id: ID!  name: String!  friends: [Character]  appearsIn: [Episode]!  starships: [Starship]  totalCredits: Int}