如何为Ruby应用程序创建REST API?

我想知道如何使用REST API提供Ruby应用程序。 我可以基于Ruby的TCPServer API编写代码,但这看起来有点低级。 你认为这是一个很好的解决方案吗? 或者你建议采用更好的方法吗?

您可以使用Sinatra快速编写微小的,专注的Web应用程序和轻量级REST服务。

在文档部分,他们重点介绍了几个关于此事的video:

  • Adam Wiggins和Blake Mizerany在RubyConf 2008上展示了Sinatra和RestClient 。 该演讲详细介绍了Sinatra的基本理念,并反映了使用Sinatra构建真实世界的应用程序。

  • Adam Keys和The Pragmatic Programmers已经开始在Sinatra上播放一系列截屏video 。 前两集包括创建一个小型Web应用程序并创建REST服务。 流行音乐5美元。

你也可以使用rails ,但这有点矫枉过正……

在设计RESTful API时涉及多个层,每层都有几种有效的方法。

TCPServer确实是非常低级别的,因为你必须自己实现HTTP协议,这是不推荐的。

最后一步是Rack,它负责处理所有低级HTTP细节。 这就是Rails,Sinatra或Ramaze等所有Ruby Web框架的使用范围。 它还确保您的应用程序可以在各种应用程序服务器上运行,例如Passenger,Thin或Unicorn。

但即使Rack仍然处于低级别,它为您提供HTTP,但更高级别的框架使得样板不再是典型的Web编程。 对于API,您可以查看像Sinatra这样的最小框架,或者专门为Grape或Rails :: API等API设计的框架。 这些已经假设一个RESTful样式的API,所以你应该发现它们是天生的。

典型的RESTful API的特点是具有可猜测(约定驱动)URL标识的资源,以及基于HTTP方法(动词)的操作,如GET,POST,PUT,DELETE和PATCH。 要真正接受Roy Fielding描述的REST精神,你可以转向更完整的“超媒体”API。 最明显的区别是响应更加独立。 它们具有明确定义的媒体类型(由您自己或现有规范定义),其中包含相关资源的链接,而不仅仅是数字ID。 类似地,响应包含描述可以执行的操作的模板/表单。 (还有更多,但在表面层面,你会注意到。)

这使得API更容易被人和机器发现,并且它允许更大的自由来发展API。 可能存在性能缺陷,因为客户端通常需要执行更多请求才能实现相同的function,但这可以通过深思熟虑的设计和缓存来防止。 Garner专门用于提供简单的服务器端缓存。

您可以定义适合您的应用程序的媒体类型,通常在JSON或XML之上,或者您可以查看现有规范,特别是Collection + JSON , HAL和JSON-API 。 目前看来HAL拥有最大的牵引力,在各种平台上都有几个库 。

围绕JSON-API似乎并没有发生很多事情,但是两个重要的项目,ActiveModel :: Serializers和Ember-data都采用(并同时开发)这种格式,这意味着它可能成为一种流行的选择在Ruby / Rails世界中。

编辑 :错字

我也在使用Sinatra开发简单的REST解决方案。

问题是Sinatra在很多方面都非常灵活。 您可以按照自己喜欢的方式构建项目结构。 Usualy我们有一个lib / tmp /和public /目录以及一个config.ru和app.rb文件,但正如我所说,你可以构建你想要的任何东西。

要记住,Sinatra不是通常的MVC,因为de M(模型)。 为了将sinatra用于Simple CRUD Web应用程序,您只需加载gem即可。

require 'datamapper'

或其他您喜欢的sqlite, sequel, ActiveRecord, ...

并且你的Sinatra下有一个ORM。

在Sinatra下,您可以定义遵循四个主要建议GET,PUT POST和DELETE的路线。

 require 'rubygems' require 'sinatra' get '/' do erb :home end get '/API/*' do api = params[:splat] @command_test = api[0] @command_helo = api[1] #... def do_things(with_it) #... end #... end __END__ @@home helo 

好吧,你得到了ideia 🙂

最后。 学习Sinatra并不是浪费时间,因为它简单,并且因为它给了我(网络编程是什么)的基础。 我想在不久的将来,可以将Sinatra应用程序(Rack Apps)“注入”Rails3项目。

看看github,你会发现许多用Sinatra建造的项目。 如需进一步阅读,请查看Sinatra :: Base。

对于简单的REST API,我也会考虑直接针对Rack库(即您可能不需要像Sinatra这样的框架)。 例如,对于简单的情况,路由可以非常容易。 我在这里放了一个小例子: https : //gist.github.com/4685445