Rails 希望懂 Grape 构建 API 的朋友进来聊一下

bluesky0318 · 2015年03月03日 · 最后由 jimrokliu 回复于 2015年03月06日 · 3661 次阅读

最近老大让用 RAILS 做一个后台服务器,很简单的下载 EXE,PDF 文件供 PC 软件在线更新,看了下 RAILS 的 GEM,发现 Grape 似乎是专业做这个的,但是看了半天没看太明白怎么用的,有高手可以进来指点一下么?我也想把这个帖子留下来直到我把这个功能完全实现。感谢各位大神赐教

为啥下载文件要用 Rails?

#1 楼 @blacktulip rails 做服务端,把要下载的文件存放在服务器,PC 端软件透过 API 接口下载文件到本地更新

Rails 不适合做文件服务器,Rails 发送文件为了效率也是用前端静态服务器的 send_file 功能发送的,或者用 S3 等云储存服务。

#3 楼 @Rei 我只是负责 API 接口这块,当前这个项目还有前端和其他的东西,我目前考虑用 Grape 来做 API,对这个 GEM 不熟悉,所以这个重点在 Grape 而不是 RAILS

目前看了下例程,有几点疑惑 1.API 文件夹必须在 APP 文件夹之下么? 2.api.rb 是干嘛的啊,里面用了 mount 这个去指定很多 Module 中的 Class,这个是啥意思呢? 3.在 Module 中 desc 干嘛的啊? 大神不喜勿喷哈,诚心求教,或者告诉在那个页面可以看到相关资料也可以

@bluesky0318 Grape 的问题完全可以在 Grape Github 上找到答案。

但另外,如果是附件管理的 API 到可以看看 Kod Explorer

#6 楼 @wppurking 看得有些生,所以才过来问问大神有没有好的档案学习一下

#6 楼 @wppurking kod explorer 是干嘛的呢?

其实你们会不会用云储存更好?

#9 楼 @Rei 云存储不需要服务端?

#9 楼 @Rei 云存储只是一个存储吧,也需要做服务端吧,不太懂你的意思

#11 楼 @bluesky0318 云储存就有 API 啊,还有各种语言的 SDK。

在线更新是有专门的解决方案的。

如果不想用现成解决方案的话,有个非常简单的方案: 你可以直接把文件放在 S3 上,在 S3 bucket 根目录放一个 METADATA 文件,记录一下版本等需要告知客户端的信息。按照一定的文件夹结构存放后,客户端根据 METADATA 下载对应需要更新的文件即可。

#12 楼 @Rei 老大有这个要求,因为还有一些东西是需要 rails 支持的。不是云存储就可以全部解决呢

#13 楼 @kgen 这个还真没做过,感谢 kegen,想回到最初的主题,Grape 不能用做做 API 提供下载服务么?

楼上有的说用 Grape、有的说用云服务,那么问题来了,到底应该使用那种解决方案呢?

这个当然还是要根据你的业务场景来推算了。你需要提供 PC 软件在线更新的服务,那有多大的量呢?一个文件会不会有 20G?如果单个文件真有这么大,云服务无疑省时省力。但根据我的推算并没有。

因为你的老大知道 rails,说明他是搞技术的,让你用 http 协议走文件传输,而不是其他文件传输专有的协议,说明这并不是一个大项目,文件的总量也不会太多,不会上 PB 的大小。从你提问的方式来看,你知道用 GEM,但却不会用 Grape,说明你刚做 ruby 不满一年,经验尚浅,你老大放心让你做说明这个项目不是太大,而且是让你拿来练手,顶多是给内部员工或者客户的软件提供简单的文件传输功能。以此推断,我感觉不太需要用云服务,所以安安心心就用 send_file 吧。

再回答你的问题

  1. 不必须。人家这样写,你就这样做,不要做你不能把控的事情,因为你是新手。
  2. mount 是挂载,通常用来加新版本 API,客户端是不会自动更新的,所以通常老版本 API 要保留。
  3. desc 是 description 的缩写,是用来描述你这个 API,对生成 API 文档有帮助

其实这些都很简单呢,在 github 上多看就 OK,你说 github 老打不开?详情咨询 13 楼 😄

#16 楼 @MrPasserby 是的,一直是做 PC 端开发的,看 ruby 看了 1 年多吧,当然没有具体的项目练习,所以不是很熟练,文件不是很大,就是 EXE,自定义的 OCE,PDF,EXCEL,WORD 文件,一般都是几 M 而已,老大在台北,所以他无法指导我,而且你也晓得一般到高级经理写代码也少,更多的是需要你自己发挥。 感谢回复的问题,github 打得开的,呵呵,只是看着项目太多,都无从着手,恩,在慢慢学习 grape 这个 GEM 的一些特性。如果有做过的兄弟也可以进来谈谈

目前想实现的功能其实就很简单了,就是用 Grape 这个建构 API,PC 端访问 API,下载对应的文件到本地地就好,之所以要用 grape 倒也不是说老大非要用这个 gem,我是看好多推荐这个,而且从经验来看,能用框架或者说别人做好的东西就用吧,非要自己写那不是回到原始社会也不是 rails 的初衷。 目前看倒 grape 的 wiki 中有说明怎么写 API,慢慢实践中

#16 楼 @MrPasserby 主要是不太熟悉这里面的流程,边做边想吧,感谢提供思路 send_file 我查查看功能

你用 send_file 就行,配合一下 nginx 用。

#20 楼 @jimrokliu 我用 grape 搭建了 API,用 curl 命令对于数据库的增,删,查,改,更新都实现了,然后我自己定义了一个函数去 send_file,但是提示说在 class product < Grape::API 这个类里面找到不 send_file 这个函数,请问如何处理啊,是不是要 require 某个文件过来呢?

#21 楼 @bluesky0318 确实没有这个函数,官方给出的方法是 https://github.com/intridea/grape#sending-raw-or-no-data,一个意思

#22 楼 @MrPasserby 真心厉害,感谢,我试试这个,我咋看好久没看到这一段啊,我擦,真是鬼打眼了

你可以只拿他做管理,然后文件存到云存储上就好了

大家都知道的几点:

  • 存储是和业务逻辑分离的。
  • Rails 框架本身并不适合做文件服务器(当然这里也不是要用 Rails 搭一个文件服务器,而是只用 Rails 实现一套简单的业务逻辑)。
  • 你本身的下载需求很简单,业务量也不是很大。

那么问题来了:Rails API 哪家强?

至于 rails jbuilder 什么的,看个人喜好了。Grape 总体来说还是很不错的,你可以在 Github 上读读 Ruby-China 的源代码,看这里的 Grape 是怎么写的,然后去实现自己那套。

我也正在读:)

#25 楼 @pengedy 嗯嗯,现在把 Grape 慢慢理顺了,还比较爽,哈哈,加油

#21 楼 @bluesky0318 send_file 是 rack 提供的功能,rails 倒是能用,如果在 grape 里用的话,我得研究一下。

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