我想知道如何使用REST API提供Ruby应用程序。我可以基于Ruby的TCPServer API编写代码,但这看起来有点低级。你认为这是一个很好的解决方案吗?或者你建议采用更好的方法吗?
答案 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这样的最小框架,或专门为Grape或Rails::API等API设计的框架。这些将已经假设一个RESTful样式的API,所以你应该发现它们是一个自然的契合。
典型的RESTful API的特点是具有可猜测(约定驱动)URL标识的资源,以及基于HTTP方法(动词)的操作,如GET,POST,PUT,DELETE和PATCH。要真正接受Roy Fielding所描述的REST精神,你可以转向更完整的“超媒体”API。最明显的区别是响应更加独立。它们具有明确定义的媒体类型(由您自己或现有规范定义),其中包含相关资源的链接,而不仅仅是数字ID。类似地,响应包含描述可以执行的操作的模板/表单。 (还有更多内容,但在表面上,这是你会注意到的。)
这使得API更容易被人和机器发现,并且它允许更大的自由来发展API。可能存在性能缺陷,因为客户端通常需要执行更多请求才能实现相同的功能,但这可以通过深思熟虑的设计和缓存来防止。 Garner专门用于提供简单的服务器端缓存。
您可以定义适合您应用的媒体类型,通常在JSON或XML之上,或者您可以查看现有规范,尤其是Collection+JSON,HAL和JSON-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