学习GraphQL技术

首先

在公司参加了GraphQL项目,由于之前只接触过Rails,对GraphQL不太了解,所以在Udemy购买了下面的视频进行学习。

【浩门式】React GraphQL 前端工程师入门教程

我想用简洁的语言解释一下我学到的东西。
这个视频主要介绍了前端的使用方法,但我也想解释一下在Rails后端的处理过程。

GraphQL是一种查询语言。

在GraphQL官方网站上写道,GraphQL是一种用于API的查询语言和查询执行的运行时。

这是一个用于获取数据的API。在REST API中,根据URI返回相应的数据,而在GraphQL中,发送请求后也会返回相应请求的数据。

顺便提一下,GraphQL是由Facebook开发的。

GraphQL的优点

只有一个终点

REST API 根据访问URI的不同产生不同结果。例如,获取 Qiita API 中标签列表(按文章数量降序排列)的API URI 为https://qiita.com/api/v2/tags?page=1&per_page=20&sort=count。
获取其他数据的API使用其他URI,因此根据需求不同宛先URI也会有所变化。

在GraphQL中,只有一个端点。
例如,Github的GraphQL API的端点是https://api.github.com/graphql,因此无需设计URI。你不需要考虑什么样的URI更容易理解之类的问题。

只能获取必要的数据

在上面提到的Qiita的例子中,当访问https://qiita.com/api/v2/tags?page=1&per_page=20&sort=count时,可以获取到一些关注人数、id等信息。

如果只需要id,那么获取其他数据就会变得无用。也许在这种程度上差异不大,但如果只需要海量数据的一小部分,会影响性能。

实施即为规范文件。

在使用REST API时,需要创建关于哪个URI返回什么样的数据的文档。因此可以使用Swagger等工具来创建文档(示例)。然而,在使用GraphQL时,可以通过模式来驱动开发,并且可以使用GraphiQL等工具在开发过程中查看模式(如下图),所以特别是不需要创建文档,实现的内容将直接成为文档,这样就可以避免文档和实现之间的不一致。

image.png

当然,在涉及到公开API的情况下,如果需要附加说明,则可能需要相应的文档。

如何编写前端查询

这个非常简单,只需要描述查询的名称和所需数据。
可以在GraphiQL的演示中试一试。

image.png
image.png

服务器端实现方法(Rails)

我在视频中没有看到,但是后端的实现当然也是必要的,所以我会简单解释一下。
首先,需要安装graphql-ruby。

在这里,我们创建一个名为Post的模型(它有title和content两个列),通过传递id来实现查询并返回相应的帖子。

首先需要定义数据类型。

module Types
  class PostType < Types::BaseObject
    description "A post"
    field :id, ID, null: false
    field :title, String, null: false
    field :content, String, null: false
  end
end

接下来我们将创建一个用于返回给客户端的查询。

module Queries
  module Post
    class Post < BaseQuery
      description 'post'
      type Types::PostType, null: true # 返り値の型
      argument :id, Int, required: false # 引数

      def resolve(:id)
        ::Post.find(id) # Postモデル
      end
    end
  end
end

如果在客户端使用此ID作为参数发出查询,您将能够获得由Types::PostType定义的返回类型的值。

因此,根据客户需求/要求

query {
 post(id:123) {
   id
   title
 }
}

只要发出查询,就可以获取id为123的帖子的id和title。如果还想要content,只需在查询中添加即可。非常简单。

总结

一开始不太明白,但是习惯了就很容易理解了。而且如果前端和后端的开发团队分开的话,不需要写文档,也不需要向前端解释,只需专注于后端的实现,这样非常好。

广告
将在 10 秒后关闭
bannerAds