使用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!"}}

结束了。

广告
将在 10 秒后关闭
bannerAds