即使是一个完全不懂技术的人也可以理解GraphQL(Apollo,graphql-rails)的知识0
勉強过的笔记 guò de
在REST中,对于一个API访问,只能获取一种固定形式的数据,但是使用GraphQL,可以根据自己的喜好以自己想要的组合方式获取数据。要使用这么方便的GraphQL,可以在Nuxt.js中使用Apollo,在rails中使用graphql rails库。
尽管 GraphQL 的官方文档是英文的,但它非常易懂,通过阅读文档可以大致理解其基本概念。
前端(本次使用Nuxt.js)
安装部分省略
在nuxt.config.js文件中写入设置。
内容是调用API的位置。
...,
apollo: {
clientConfigs: {
httpEndpoint: `http://localhost:4000/graphql`
}
},
...
查询
查询是指请求数据的行为。
在apollo/queries目录下编写各种查询。
例如,apollo/queries/item.gql。
# 引数の定義を書いておく
query Item($id: Int!){
# 引数を書く
item(id: $id) {
#欲しいフィールドを書いていく
id
name
price
userId
imageUrl
explanation
}
}
请查看相关文件以获得更详细资料。
变异
当进行数据修改或删除时,可以使用mutation(变异)。
将mutation文件编写在apollo/mutation下。
例如,apollo/mutation/deletelike.gql。
mutation ($id: ID!){
deleteItem(input: {id: $id}){
Item {
id
}
}
}
查询和变异的使用方式
考虑在index.vue中使用作为一个例子。
在 script 标签内,从 gql 文件中导入 query/ mutation 的名称。
比如说,
import Item from '~/apollo/querys/item.gql'
成为这样。
当想要直接使用从查询中获取的数据时,可以使用{{ item }}。
在export default中
data(){
...
},
apollo {
item: {
query: Item
}
},
...
描述如下。
当需要在方法内使用时
使用deleteItem的时候,
method(){
...,
hoge(){
this.$apollo.mutate({
mutation: deleteItem,
#以下で定義する変数はmutationファイル内で定義した変数たち
variables: {
id: id
}
})
}
...
}
用中文来重新表述:
就是这样。当想要使用query时,只需要使用$apollo.query,然后将query: Item即可。
赠品
变异后,如果不进行更新,就无法在外观上显示出来。
refetchQueries: [{
query: getUsersGql
}]
最好执行诸如此类的操作。
在这里,服务器端(本次我们使用rails)
Gemfile写入
gem 'graphiql-rails'
gem 'graphql'
在使用bundle install命令后,运行rails g graphql:install,Rails将自动为我们进行各种设置。routes.rb将被更新如下:
...
if Rails.env.development?
mount GraphiQL::Rails::Engine, at: '/graphiql', graphql_path: '/graphql'
end
...
在应用程序的目录下创建了一个graphql目录。
种类
首先,需要定义GraphQL返回数据的类型,可以在app/graphql/types下为每个模型创建一个文件。
以下是user模型的类型文件示例。
Types::UserType = GraphQL::ObjectType.define do
# 型名
name 'User'
# field :(要素名), (要素のタイプ(int, string, etc))
field :name, !types.String
field :email, !types.String
end
查询
撰写一个请求将返回在Types文件中定义的类型的查询。
创建一个名为 app/graphql/types/query_type.rb 的文件,并在其中编写所有查询。
module Types
class QueryType < Types::BaseObject
# まずはクエリの大枠だけ書く
# field :(クエリ名), Types::(定義した型名), null: (true/false) do
field :user, Types::UserType, null: false do
description 'ユーザ情報を1件取得する' # クエリの説明
argument :id, Int, required: true, description: 'ユーザID' # クエリに回す引数
end
# 上のクエリの詳細の動きをクエリ名と同じ関数名で書く
def user(id:)
User.find(id)
end
end
end
实施的过程
当访问/graphql时,将执行graphController内的execute操作。
Rails.application.routes.draw do
...
post '/graphql', to: 'graphql#execute'
...
end
class GraphqlController < ApplicationController
...
def execute
variables = ensure_hash(params[:variables])
query = params[:query]
operation_name = params[:operationName]
context = {}
result = ApiSchema.execute(query, variables: variables, context: context, operation_name: operation_name)
render json: result
end
...
params存储了调用query时的参数,并调用并执行指定的查询。