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

时间:2009-11-02 10:23:22

标签: ruby rest

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

4 个答案:

答案 0 :(得分:25)

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

documentation部分,他们会突出显示有关此事的几个视频:

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

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

您也可以使用rails,但这有点矫枉过正......

答案 1 :(得分:9)

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

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

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

但即使Rack仍然处于低级别,它为您提供HTTP,但更高级别的框架将典型的Web编程从样板中删除。对于API,您可以查看像Sinatra这样的最小框架,或专门为GrapeRails::API等API设计的框架。这些将已经假设一个RESTful样式的API,所以你应该发现它们是一个自然的契合。

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

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

您可以定义适合您应用的媒体类型,通常在JSON或XML之上,或者您可以查看现有规范,尤其是Collection+JSONHALJSON-API。目前看来,HAL具有最大的牵引力,several libraries可在各种平台上使用。

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

修改:错字

答案 2 :(得分:7)

我也在使用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

你得到了意识形态:)

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

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

答案 3 :(得分:1)

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