我想知道如何提供一个REST API Ruby应用程序。 我可以编写基于Ruby的TCPSERVER API的东西,但似乎有点低的水平。 你是否认为这将是一个很好的解决方案? 或者你推荐一个更好的方法吗?
Answer 1:
您可以使用西纳特拉很快写微小的,集中的Web应用程序和轻量级的REST服务。
在文档部分,他们强调了几个关于此事的视频:
亚当·威金斯和布雷克Mizerany目前西纳特拉和RESTClient实现在2008年RubyConf的 。 讲座详情Sinatra的基本理念和使用Sinatra和构建真实世界的应用体现。
亚当键和务实的程序员已经开始了一系列的截屏上西纳特拉。 前两分集介绍创建一个小的Web应用程序并创建一个REST服务。 $ 5流行。
您还可以使用轨道为好,但是这是一个有点矫枉过正?
Answer 2:
有设计方法 - 一个RESTful API时所涉及若干层,并且在每一层有几种有效的方法。
TCPSERVER确实是非常低的水平,因为你必须自己实现不推荐使用HTTP协议。
一是加大将机架,这需要所有低级别的HTTP细节。 这是什么样的Rails的Ruby的所有web框架,西纳特拉或Ramaze引擎盖下使用。 它还可以确保你的应用软件可在各种应用服务器,如汽车,薄或独角兽。
但是,即使架仍处于低位水平,它为您提供了HTTP,但更高层次的框架,把样板出典型的网络编程。 对于一个API,你可以看看像西纳特拉最小的框架,或专为喜欢的API设计的框架葡萄或Rails的API :: 。 这些就已经假设一个RESTful风格的API,所以你会发现他们是天作之合。
典型RESTful API中的特征在于具有基于HTTP方法(动词)等GET那些鉴定可猜测(约定驱动)的网址,和操作资源,POST,PUT,DELETE和补丁。 要真正拥抱REST的精神,因为它是由Roy Fielding描述然而,你可以朝着更加完整的“超媒体” API移动。 最明显的区别是,响应更自成一体。 它们包含相关资源的链接,而不是仅仅的数字标识符明确定义的媒体类型(由自己或由现有规格的定义)。 同样响应包含描述可以执行的操作模板/表格。 (还有更多的,但在表面上的水平这是你会发现什么。)
这使得API更容易找到,都是由人和机器,它允许更大的自由度在不断发展的API。 有可能是一个性能缺点,因为客户通常需要做更多的要求来达到同样的事情,但是这可以通过深思熟虑的设计和缓存来防止。 加纳是专门用来提供方便的服务器端缓存。
您可以定义自己的应用自己的媒体类型,常见于JSON或XML的顶部,或者你可以看一下现有的规范,尤其是收藏+ JSON , HAL和JSON-API 。 看来目前HAL具有最大的牵引力,与几个库在各种平台上使用。
有貌似不是一大堆各地的JSON API发生的事情,而是两个signifacnt项目::加载ActiveModel串行器和灰烬数据,都采用(并在同一时间,开发)这种格式,这意味着它可能会成为一个受欢迎的选择在Ruby / Rails的世界。
编辑 :错字
Answer 3:
我使用过屈开发简单的REST的解决方案。
事情是西纳特拉在许多方面非常灵活。 你可以建立你的项目结构,你更喜欢的方式。 Usualy我们有一个lib / tmp目录/公共/目录和config.ru和app.rb文件,但我sayd你可以建立任何你想要的。
要记住的是,西纳特拉不是一个通常的MVC只是因为德M(模式)。 供您使用西纳特拉为简单的CRUD web应用程序,你需要简单地加载一个宝石。
require 'datamapper'
或其他您所选择像sqlite, sequel, ActiveRecord, ...
瞧,你在你的末日了一个ORM。
在西纳特拉你定义服从四个主要提出了GET,PUT POST和删除路由。
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 :)
最后。 学习西纳特拉不是因为它简单浪费时间,对什么是Web编程是因为它给了(我)的基础。 我认为,在不久的将来,将有可能“注入”西纳特拉的应用程序(机架应用程序)为Rails3中的项目。
看看到github上,在那里你会发现许多项目与西纳特拉建成。 进一步的阅读结账西纳特拉::基地。
Answer 4:
对于简单的REST API我也会考虑直接针对机架库工作(即你可能不需要像西纳特拉的框架)。 路由例如可以是简单的情况下,很容易。 我在这里把一个小例子: https://gist.github.com/4685445