使用GraphQL和Rails构建API的方法

在这篇文章中,我们将使用GraphQL和Rails来构建一个通过查询从数据库中返回ToDo的API。

這個博客是由英文版翻譯而來的。您可以在這裡查看原版。我們部分使用了機器翻譯,如果有任何翻譯錯誤,請您指正,我們將不勝感激。

阿里巴巴云社区博客的作者丹尼尔·肖通华先生。

在这篇文章中,我们将介绍如何利用GraphQL和Rails在阿里巴巴云上构建一个可以通过查询从数据库中发送Todo的API。现在,在开始之前让我们先明确一些事情。

image.png

来源:五美.com

首先,您应该已经知道 – 尤其是考虑到您在最初点击此处的事实 – Rails 是一个非常受欢迎的用于快速创建网络应用程序的框架。开发人员倾向于通过创建后端API来分离应用程序的过程和机制,并使用他们喜欢的库。我们自己也将按照这个趋势行事。

接下来,可能许多人都知道的是,还有GraphQL。关于GraphQL是什么,可以从https://graphql.org/这个网站上的定义中详细解释。

GraphQL是用于API的查询语言,也是执行查询的运行时,使用现有数据进行查询。GraphQL可以以完整和易于理解的形式描述API内的数据,并允许客户端准确地请求其所需内容。

除了使用GraphOL和Rails,本教程还将使用在Ubuntu 16.04上安装的Elastic Compute Service (ECS)实例来部署应用程序。因此,在继续之前,请确保您已在阿里巴巴云的帐户上进行了注册。

前提条件 tí

在开始之前,请确保ECS实例已经设置好。如果还没有设置,可以查阅阿里巴巴云相关文档,以便轻松设置。

请确认您的本地机器上已安装ruby版本2.2或更高版本以及rails版本5或更高版本。

如果您的 Ruby 版本不是最新的,可以使用 rvm 或 rbenv 等 Ruby 版本管理器进行更新。另外,您还可以通过调用以下相应的命令来更新 Ruby 的版本。

    $ rvm install "ruby-2.4.6"  
    or  
    $ rbenv install 2.4.6

你也可以通过执行以下命令来更新 Rails。

    $ gem update rails

然后…只需要这个!这样,就准备好在Rails上构建一个简单的GraphQL API了。

操作的方式

创建数据库和文本编辑器

作为本教程的一部分,我们也期望您具备以下工具。

    Postgres データベース

– 文本编辑器 qì)

为了达到这个目的,您需要在命令行中执行rails命令,创建使用Postgres数据库所需的所有基本Rails应用程序的文件和文件夹。

$ rails new todo-app `--database=postgresql`  
$ cd todo-app

宝石的设定

在此期间,我们可以采取以下步骤:要在Rails中创建一个graphql应用程序,需要添加名为graphql的gem。然后,将这个gem添加到Gemfile中。

可以使用`gem’graphql’`命令来完成。然后,执行`$ bundle install`命令来安装gem。这样就应该安装了gem。接下来,为了创建GraphQL API所需的所有文件和文件夹,执行以下命令。

$ rails generate graphql:install

当你执行这个命令时,将会在Gemfile中添加 graphiql-rails gem。通过使用这个gem,你可以与API进行交互。

数据库配置 (Database configuration)

要将应用程序连接到Postgres数据库,需要访问config/database.yml文件,在测试环境和开发环境中都添加Postgres的用户名和密码。

    development:  
      <<: *default  
      database: todo_app_development  
      username: YOUR_POSTGRES_USERNAME  
      password: YOUR_POSTGRES_PASSWORD

    test:  
      <<: *default  
      database: todo_app_development  
      username: YOUR_POSTGRES_USERNAME  
      password: YOUR_POSTGRES_PASSWORD

使用$ rails db:create命令创建数据库,并使用$ rails server命令运行服务器。

当访问这个地址 localhost:3000/graphiql 时,会显示出graphql客户端,并可利用它向graphql服务器发送请求。

image.png

创建模型

在这个todo应用程序中,我们将创建一个具有title和description两个字段的todo表。执行并创建模型。

   $ rails generate model Todo title:string description:text

在输入到数据库之前,可以通过确保标题和描述字段始终是指定的,来进行验证。转到models/todos.rb文件并添加Rails验证。

    class Todo < ApplicationRecord  
        validates :title, presence: true  
        validates :description, presence: true  
    end

使用 $ rails db:migrate 命令进行迁移,并使用 rails console 将数据添加到数据库中。

    $ rails console  

    >- Todo.create(title: 'Sample title', description: 'Sample Description')
image.png

GraphQL模式中有三种特殊的根类型,它们被称为Query、Mutation和Subscription。

    • Query`: データベースからデータを取得できるようにするグラフQL機能です。Rest APIのGETコールのように動作します。

Mutation: クライアントがデータベースにデータを送信できるようにするグラフQL機能です。REST APIのPOST、PUT、DELETE操作のように動作します。

Subscription:サブスクリプションは、特定のイベントが発生したときにサーバーがクライアントにデータを送信することができるようにするグラフQL機能です。サブスクリプションは通常 WebSocket で実装されます。アクション ケーブル

创建查询

那么,让我们创建一个查询来从数据库中获取所有的TODO的初始查询。创建一个新文件app/graphql/types/todo_type.rb来为todos创建一个新的类型。

    #app/graphql/types/todo_type.rb

    module Types  
      class TodoType < Types::BaseObject  
        field :title, String, null: false  
        field :description, String, null: false  
      end  
    end

由于继承BaseObject,所以请参考app/graphql/types/base_object.rb。不需要编写GraphQL::Schema::Object,只需继承Graphql的Schema type,就可以获得创建对象Schema所需的所有属性,只需继承BaseObject即可。

下一步是创建一个用于获取所有待办事项的查询类型。请移动到app/graphql/types/query_type.rb文件中。为了获取所有待办事项,需要在查询类型中添加一个名为:all_todos的新字段。

    # app/graphql/types/query_type

    field :all_todos, [TodoType], null: false,  
        description: "Returns all todos"  
    def all_todos  
        Todo.all  
    end

添加[TodoType]部分是因为希望获得Todo列表。现在,我们打开浏览器,并编写如下查询。

    query {  
      allTodos {  
        title  
        description  
      }  
    }

通过这个,它可以返回数据库中的所有待办事项,因此可以省略标题并仅请求说明,反之亦然。

image.png

Mutation的添加

接下来我们要添加用于创建Todo的变异。在此之前,让我们创建一个继承自GraphQL::Schema::Mutation的BaseMutation类。这样,我们将来就可以继承BaseMutation类了。

接下来,在apps/graphql/mutations文件夹中创建一个名为base_mutation.rb的新文件,并添加以下代码。

       # app/graphql/mutations/base_mutation.rb
        module Mutations  
          class BaseMutation < GraphQL::Schema::Mutation  
            null false  
          end  
        end

那么,让我们创建一个用于添加todo的变异。为此,在mutation文件夹内创建一个名为add_todo.rb的文件,并添加以下代码。

    #app/graphql/mutations/add_todo.rb  
    module Mutations  
      class AddTodo < BaseMutation  
        argument :title, String, required: true  
        argument :description, String, required: true  

        type Types::TodoType  

        def resolve(title: nil, description: nil)  
          Todo.create!(title: title, description: description)  
        rescue ActiveRecord::RecordInvalid => e  
          GraphQL::ExecutionError.new(e.record.errors.full_messages.  
    join(','))  
        end  
      end  
    end

這段程式碼會新增 AddTodo Mutations,同時指定所需的參數和返回的型別。

在变异的代码中存在一个救援块。在Rails的GraphQL中,有一个名为GraphQL::Execution.new(error_messages)的错误处理块。

将创建的mutation添加到mutation类型中,以便客户端可以访问。

# app/graphql/types/mutation_type.rb  
module Types  
  class MutationType < Types::BaseObject  
     field :add_todo, mutation: Mutations::AddTodo  
  end  
end

请使用这个查询来创建一些待办事项,并在浏览器上进行测试。

mutation {  
  addTodo(title: "New Todo", description: "I will eat rice") {  
    title  
    description  
  }  
 }
image.png

引入GraphQL

请按照本教程的步骤,使用已经拥有的阿里巴巴ECS实例部署GraphQL API。通过使用Passenger和Nginx,您可以轻松地部署Rails应用程序。

而且在部署这个状态下。通过这样,我们可以创建一些待办事项,并使用查询从数据库中获取待办事项的方法。为了让用户能够登录、删除或更新待办事项,我们计划撰写另一篇文章,对进行授权和认证的过程进行讲解。

你没有阿里巴巴云的账户吗?注册一个账户,免费试用40多个价值最高1200美元的产品。详细信息请参阅阿里巴巴云的入门指南。

阿里巴巴云拥有两个数据中心在日本,在全球拥有超过60个可用区,是亚太地区最佳的云基础设施供应商(2019 年 Gartner 报告)。有关阿里巴巴云的详细信息,请点击此处。阿里巴巴云(阿里云)日本官方网页。

广告
将在 10 秒后关闭
bannerAds