使用 Hasura Actions 将 Ruby on Rails REST API 转换为 GraphQL

作者:API传播员 · 2025-09-25 · 阅读时间:4分钟

在本文中,我们将演示如何通过 Hasura Actions 将现有的 Ruby on Rails REST API 转换为 GraphQL。这可以让你利用 Hasura 的强大功能,将自定义业务逻辑无缝集成到 GraphQL API 中,提高开发效率和可维护性。


一. 什么是 Hasura Actions?

Hasura Actions 是一种扩展 Hasura GraphQL 模式的方式,允许你定义自定义查询(Query)和变更(Mutation),以实现复杂的业务逻辑。典型应用场景包括:

  • 数据验证
  • 外部数据源的数据丰富
  • 复杂业务逻辑处理

如果已有 GraphQL 服务器,也可以通过远程模式与 Hasura 集成,Hasura 会自动合并 GraphQL 模式。

本教程聚焦于使用 Actions 将 Ruby on Rails REST API 转换为 GraphQL。


二. 准备工作:Hasura 与 Postgres 设置

  1. 创建一个 Postgres 数据库,可使用 Heroku 免费层。
  2. 登录 Heroku,创建新项目并启动控制台。
  3. 获取 Hasura GraphQL 端点,该端点支持全局访问、安全且可扩展。

三. 创建 Hasura Action

  1. 打开 Hasura 控制台,进入 Actions 标签页,点击 Create
  2. 定义一个名为 registerUser 的 Mutation,参数包括 nameemailpassword,返回 id
mutation {
  registerUser(name: "Marion", email: "marion@example.com", password: "mysecretpassword") {
    id
  }
}

提示:如果出现 HTTP 异常,这是因为处理程序 URL 尚未配置。


四. 自动生成 Ruby on Rails 样板代码

创建 Action 后,可点击 Codegen 自动生成 Rails 样板代码:

class HasuraController < ActionController::API
  def register_user_handler
    request_data = params[:input]
    render json: request_data
  end
end

五. 添加业务逻辑

在生成的代码中实现核心逻辑,例如:

  1. 哈希用户密码。
  2. 调用 Hasura API 保存用户数据。
  3. 返回用户对象或错误信息。

示例:

class HasuraController < ActionController::API
  def register_user_handler
    input = params[:input]
    hashed_password = BCrypt::Password.create(input[:password])
    # 调用 Hasura API 保存用户数据
    render json: { id: 1 } # 返回示例用户 ID
  end
end

六. 配置与运行服务器

  1. 安装 Ruby 和依赖。
  2. 启动服务器:
ruby register_user.rb

服务器默认运行在 http://localhost:3000,更新 Hasura 中的 Action 处理程序 URL:

http://localhost:3000/registerUser

若 Hasura Cloud 无法访问本地服务器,可使用 ngrok 创建公网 URL:

ngrok http 3000

七. 测试 GraphQL 端点

在 GraphiQL 中测试:

mutation {
  registerUser(name: "John", email: "john@example.com", password: "securepassword") {
    id
  }
}

如果配置正确,将返回用户 ID。


八. 数据库与权限

  • 通过 Hasura 自动生成的 GraphQL API 与数据库交互。
  • 配置角色和权限,例如创建 public 角色,允许执行 registerUser 变更。

Hasura 提供基于角色的访问控制,可在 Permissions 标签页配置。


九. 重用现有 REST API

若已有 REST API,可通过 Action 将其转换为 GraphQL:

  1. 确保 REST API 能处理 Hasura 请求格式。
  2. 支持请求体格式:
{
  "action": { "name": "registerUser" },
  "input": { "name": "John", "email": "john@example.com", "password": "secret" },
  "session_variables": {
    "x-hasura-user-id": "1",
    "x-hasura-role": "public"
  }
}

可以在同一服务器托管多个端点或将功能拆分为无服务器函数(Serverless Functions)。


十. 总结

通过 Hasura Actions,你可以轻松将 Ruby on Rails REST API 转换为 GraphQL,同时保留原有业务逻辑。Hasura 提供的工具使开发、管理 GraphQL API 变得简单高效,是现代应用开发的理想选择。

原文链接:Hasura Blog