从Rails应用程序中使用REST API

时间:2011-03-22 02:57:31

标签: ruby-on-rails api web-applications rest

我正在构建我的第一个Rails应用程序,我希望它能够使用REST API中的所有内容。我想要做的是让Rails服务我的Web应用程序作为我的API的前端。据我所知(我现在正在盯着Rails),Rails在ORM和直接访问数据库系统方面具有很大的潜力。另一方面,我的平台的设计方式是通过定义的接口(在本例中为REST API)访问每一层,因此不会从任何客户端读取数据库,而是通过其接口读取数据库。

例如,我的API公开了以下资源:

https://api.example.com/v1/users/feature-xxx [GET]

我希望我的网络应用程序有一个类似的页面:

https://example.com/feature

因此,用户将访问此URL,登录后,Rails应用程序将请求数据从我的API生成此动态内容。

问题是:

  • 我的Rails应用程序从HTTP / Rest后端使用数据的必要步骤是什么?和,
  • 这对Rails应用程序来说是一个很好的设计吗?

谢谢!

4 个答案:

答案 0 :(得分:31)

ActiveResource不再包含在Rails 4.0中。 Word现在几乎没有维护,并且很难为REST API端点定制,而这些端点没有根据" Rails方式"制定。

经过一番研究,我非常赞成使用Faraday。它包括对使用不同HTTP请求适配器的支持。它可以直接使用EventMachine,或者在您决定获得并发时使用像Typhoeus这样的库。它还支持类似Rack的中间件,可以无缝地包括身份验证。

对于容易配置的Rails中的REST ORM,相对较新的(大约一年)Her看起来非常有前途,并且使用法拉第。

<强>更新

我完全&lt; 3 RestClient。很简单。如果您需要ORM风格的功能,那么您需要更高级别的抽象,但是为了简单地使用API​​,您无法超越它的简单性。它只是做了它应该没有大惊小怪的事情,具有合理的默认值,并且能够设置高级选项,例如auth标题。

答案 1 :(得分:21)

我强烈建议ActiveResource满足您的要求。我的经验非常好。如果您打算使用的API是真的 REST,我认为没有任何更清洁的设计可以通过REST API使用数据。从它的README,

  

活动资源

     

活跃资源(ARes)   连接业务对象和   代表性国家转移(REST)   网页服务。它实现了   REST Web的对象关系映射   服务提供透明   客户端之间的代理功能   (ActiveResource)和RESTful服务   (由Simply RESTful提供   路由   ActionController的::参考资料)。

     

哲学

     

Active Resource尝试   提供连贯的包装   REST Web的对象关系映射   服务。它遵循相同的原则   哲学作为积极记录,在那   其主要目标之一是减少   映射到这些代码所需的代码量   资源。这是可能的   依赖于一些代码和   制定的基于协议的约定   Active Resource很容易推断出来   复杂的关系和结构。   这些惯例概述于   文档中的详细信息   的ActiveResource ::基

     

概述

     

模型类映射到   Active的远程REST资源   资源与Active一样   记录将模型类映射到数据库   表。当向a发出请求时   远程资源,一个REST XML请求   生成,传输和结果   收到并序列化为可用的   Ruby对象。

     

配置和使用

     

放置活跃   使用的资源非常相似   积极记录。这很简单   创建一个继承的模型类   来自ActiveResource :: Base和   为它提供一个网站类变量:

class Person < ActiveResource::Base  
  self.site = "http://api.people.com:3000/" 
end 
     

现在   Person类启用了REST并且   可以非常调用REST服务   类似于Active Record调用的方式   运作的生命周期方法   对持久的商店。

# Find a person with id = 1 
ryan = Person.find(1) 
Person.exists?(1)  # => true 
     

如您所见,方法是   与Active Record非常相似   处理数据库的方法   记录。而不是处理   直接用数据库记录,   你正在处理HTTP资源   (可能是也可能不是数据库   记录)。

Read more here...

答案 2 :(得分:7)

如果您决定不使用像Farady或HTTParty这样的HTTP客户端库,则可以使用open-uri从您需要的端点获取数据,并使用JSON解析它。

要求:open-uri和json

在控制器中:

@people = JSON.parse(open("http://api.people.com:3000/people").read, symbolize_names: true)

在视图中:

<% @people.each do |person| %>
    Name:<%= person[:name] %>
    Age:<%= person[:age] %>
<% end %>

答案 3 :(得分:4)

是的,这可能是一个很好的设计。

我的建议是“使用Ruby和Rails进行面向服务的设计: http://www.amazon.com/Service-Oriented-Design-Rails-Addison-Wesley-Professional/dp/0321659368

它专注于Restful Ruby应用程序,就像你的例子一样,强调缩放和性能。它还研究了不同的框架(Rack,Sinatra,Rails)以及它们填补的角色。

不幸的是我没有实现这个策略我的自己(还是!)所以我不能给你任何第一手的建议。