Ruby 分享一下最近新写的 Web API 框架

yetrun · 2022年08月19日 · 最后由 yetrun 回复于 2022年11月22日 · 1170 次阅读

11 月 22 日更新:今天上传了新的版本,主要调整了路由编写的语法。以前是链式语法:

route('/users', :post)
  .title('创建一个新用户')
  .params {
    param :user, type: 'object', using: UserEntity
  }
  .do_any {
    # 这里实现你的业务逻辑 ...
  }
  .if_status(201) {
    expose :user, type: 'object', using: UserEntity
  }

现在改成块状语法:

post '/users' do
  title '创建一个新用户'
  params {
    param :user, type: 'object', using: UserEntity
  }
  status(201) {
    expose :user, type: 'object', using: UserEntity
  }
  action {
    # 这里实现你的业务逻辑 ...
  }
end

第二是重新编写了文档,以教程的形式循序渐进地讲解,请看 教程。比较重要的章节是有关实体定义的,请看实体定义


零零总总写了有半年了,虽然现在并不是一个发布的好时机,但是想要先分享出来和大家伙交流一下想法。本来打算先在公司用起来的,不过最近公司没有什么新项目,老项目我也不想换框架了,人力物力呀…… 所以只在自己的个人项目下应用了,目前运转良好。

又是一个轮子,只不过有些不一样的地方。

首先,思想上它是完全面向 API 文档的。也许好多团队写文档会借助于 YAPI 这样的第三方工具,或者直接用 Postman 这样用用例来说话,再不济手写 Markdown. 我在框架里直接生成了 OpenAPI 的规格文档,在开发者实现接口的同时,文档就生成了。例如像下面这样定义一个接口,同时文档就能生成了:

route('/users', :post)
  .title('创建一个新用户')
  .params {
    param :user, type: 'object', using: UserEntity
  }
  .do_any {
    # 这里实现你的业务逻辑 ...
  }
  .if_status(201) {
    expose :user, type: 'object', using: UserEntity
  }

其次,这次将参数和返回值的写法统一起来了。像上面,我们只用了一个 UserEntity,就可以同时定义参数和返回值了,再也不用写两遍了。你的 UserEntity 内部可能是这样写的:

class UserEntity
  property :id, type: 'integer', param: false # 只返回
  property :password, type: 'string', render: false # 只用作参数
  property :name, type: 'string,
  property :age, type: 'integer'
end

其他的功能还有很多,就不想一一列举了。想进一步了解的,可以去看 GitHub 仓库:

https://github.com/yetrun/web-frame

这个框架适合纯 API 后端的场景,即前后端分离。也比较适合团队,基本用一种固定的写法构建 API. 重点是生成对应的文档,前后端不再扯皮(你的文档是这么定义的,怎么你返回的数据是长这样啊之类的云云)。

说实话最近整体的工作节奏都有些慢,受大环境的影响吧。本来打算等到我稳定运行后再发布了,但是这可能还要一阵子,就先预先发布一下看看反馈再说。现在大家运行起来可能有点吃力,因为还缺一个项目脚手架,后面会补上。

如果觉得对你有用,还望支持一下,对我回复个 +1. 如果大家热情足够的话,因为涉及到文档,我感觉上手难度还是有的,到时会建个 QQ 群或微信群做全面的答疑。如果大家热情不高,我就当成一个小众项目在我的团队里使用吧。视反馈而定。

支持一下

femto 回复

感谢

已 star 会支持 active record 不?

rc_plan 回复

active record 支持的。不过话也不是这么说,因为 active record 跟框架没关系,事实上可以拆解下来单独使用,参考 otr-activerecord. Rails 的很多组件都是这样的。

首先很认同你的理念,不用专门去写文档。 同时质疑一下,你这个对 i18n 的支持大概率是你一开始架构没考虑完善的。

mingyuan0715 回复

谢谢你的建议,i18n 确实还没支持,后面时机成熟会考虑添加。

p '支持一下!'

统一感谢大家的支持🙏

11 月 22 日有更新,顶一下

需要 登录 后方可回复, 如果你还没有账号请 注册新账号