graphqlgraphql入门


备注

GraphQL是API的查询语言和运行时,用于使用现有数据完成这些查询。 GraphQL提供了API中数据的完整且易于理解的描述,使客户能够准确地询问他们需要什么,仅此而已,使API随着时间的推移更容易发展,并支持强大的开发人员工具。

我什么时候应该使用GraphQL?

GraphQL旨在成为任何类型应用程序的外向HTTP API,但是当使用高度互连的集合|表|节点对数据进行规范化时,它是最强大的。 GraphQL查询语言(GQL)旨在以非常直观和灵活的方式投影互连数据。

实现

GraphQL本身就是一个规格 ,并实现由许多不同的编程语言。这些是最受欢迎的支持语言

客户端库

从客户端运行查询可以使用任何HTTP客户端完成,但客户端库可能非常有用。

开发工具

版本

发布日期
v0.5.0 2016年4月8日
v0.6.0 2016年5月10日
V0.6.1 2016年7月7日
v0.6.2 2016年7月21日
v0.7.0 2016年8月26日
V0.7.1 2016年9月29日
v0.7.2 2016年10月10日
v0.8.0 2016年11月10日
v0.8.1 2016年11月11日
v0.8.2 2016年11月16日

GraphQL查询语言(GQL)

而不是为每个数据资源定义URL端点,而是在GraphQL中定义一个接受GraphQL查询的端点。与传统的数据库查询语言不同,GraphQL查询语言(GQL)是根级查询返回的数据的投影。 GraphQL架构将定义数据模型和根级别查询和突变。 GQL执行这些查询并定义要返回的数据。

查询星球大战架构中的所有电影片名

星球大战数据查询allFilms只有标题的投影 GraphiQL查询

查询星球大战电影“新希望”的星球居民

在此处输入图像描述 GraphiQL查询

注意根查询film() 如何接受电影“A New Hope”的id参数,并且GQL的投影返回标题,连接到电影的行星,然后是行星的常驻名称。查看星球大战GraphiQL网站,试验GraphQL中的查询。

架构定义

GraphQL中 ,Schema定义了根执行查询和突变以及数据类型

架构对象类型

Person 类型有两个字段,一个是标准Scalar类型,另一个表示与“朋友”的其他Person类型列表的关系。链接其他类型是使GraphQL如此强大的原因。现在,在GraphQL查询语言(GQL)中,客户端可以遍历朋友图,而无需任何其他代码或高级查询。

type Person {
  id: ID
  name: String
  friends: [Person]
}
 

架构查询

person 查询按其ID查找单个人。这是使用GQL的客户端数据的入口点。

type Query {   
  person(id: ID!): Person
}
 

查询尼克的朋友的朋友的朋友

现在我们有了一个Person类型和一个人根查询,我们可以查找一个人和我们想要的人朋友网络的多少分离度。

query {
  person(id: 'nick'){
    id
    name
    friends{
      id
      name
      friends{
        id
        name
        friends{
          id
          name
        }
      }
    }
  }
}
 

服务器安装和实施

GraphQL.js

GraphQL.jsGraphQL的JavaScript参考实现。你可以通过npm安装它:

  • 如果你还没有在项目中初始化npm: npm init
  • 从npm安装GraphQL.js: npm install --save graphql

示例服务器

var { graphql, buildSchema } = require('graphql');

// Construct a schema, using GraphQL schema language
var schema = buildSchema(`
  type Query {
    hello: String
  }
`);

// The root provides a resolver function for each API endpoint
var root = {
  hello: () => {
    return 'Hello world!';
  },
};

// Run the GraphQL query '{ hello }' and print out the response
graphql(schema, '{ hello }', root).then((response) => {
  console.log(response);
});
 

服务器中间件替代品