使用Ruby + Sinatra接收GraphQL请求
这个实现太简单了,但我花了相当多的时间才做到这一步,所以写下来作为备忘录。
图灵)移动开发技术公司)之产物)为面向 API 和运行时的查询语言和运行环境。
我对替代REST的查询规范和理解很清楚。
这篇文章非常易懂,下面请看↓
GraphQL入门 – 令人想使用GraphQL
你好,#{name}!
接收到请求后,获取到名字,并通过JSON返回 “你好,hirapi!” 的字符串。
这个使用的是 rmosolgo/graphql-ruby,它是 GraphQL 的 Ruby 实现。
免责(辩解)
「暂时让其运行」是目的,如果说设计是否适合作为GraphQL API的规范,并不完全是这样。
请参考上述文章,官方GraphQL最佳实践 | GraphQL以及GitHub GraphQL API | GitHub 开发者指南等规范。
我认为从实际角度来看,可以通过接收ID并在ActiveRecord或其他方式中获取记录,然后将结果以JSON形式返回。同时,据说还可以将返回的形式定义为GraphQL::ObjectType,但本文不涉及此方面内容。
请为例外处理周围添加必要的代码。
Gemfile的翻译可以是:
宝石文件
source 'http://rubygems.org'
ruby '2.4.0'
gem 'sinatra'
gem 'sinatra-contrib'
gem 'graphql'
主要的.rb文件
require 'graphql'
require 'sinatra'
require 'sinatra/json'
require 'sinatra/reloader'
register Sinatra::Reloader
configure do
QueryType = GraphQL::ObjectType.define do
name 'query'
field :hello do
type types.String # このクエリはStringを返す("Hello, hoge!")
argument :name, types.String # nameパラメータはStringで欲しい
resolve -> (obj, args, ctx) do
"Hello, #{args['name']}!" # DB等処理。クエリ内のパラメータは配列argsで受け取る
end
end
end
Schema = GraphQL::Schema.define do
query QueryType
end
end
post '/' do
req = JSON.parse(request.body.read)
query = <<-EOS # よくない実装
{
hello(name: "#{req['name']}")
}
EOS
Schema.execute(query).to_json
end
只是Ruby端正在创建查询,但是我讨厌请求变得麻烦。应该将查询的JSON直接POST并传递给Schema.execute(query)。
举动
执行并启动服务器(使用Sinatra很方便)。
[vagrant@app app_dir]$ ruby main.rb
== Sinatra (v2.0.0) has taken the stage on 4567 for development with backup from Puma
Puma starting in single mode...
* Version 3.8.2 (ruby 2.4.0-p0), codename: Sassy Salamander
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://localhost:4567
Use Ctrl-C to stop
请求
使用curl命令以POST方式发送数据到http://localhost:4567,数据内容为'{“name”: “hirapi”}’。
回应
{"data":{"hello":"Hello, hirapi!"}}
结束了。