从Rails应用程序中使用REST API

我正在构建我的第一个Rails应用程序,我希望它能够使用REST API中的所有内容。 我想要做的是让Rails作为我的API的前端服务我的Web应用程序。 据我所知(我现在正在盯着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应用程序来说是一个很好的设计吗?

谢谢!

Rails 4.0中不再包含ActiveResource。 Word现在几乎没有维护,并且很难为不是根据“Rails方式”制定的REST API端点进行自定义。

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

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

更新

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

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

活跃资源

活动资​​源(ARes)连接业务对象和Representational State Transfer(REST)Web服务。 它实现了REST Web服务的对象关系映射,以在客户端(ActiveResource)和RESTful服务(由ActionController :: Resources中的Simply RESTful路由提供)之间提供透明的代理function。

哲学

Active Resource尝试为REST Web服务提供连贯的包装器对象关系映射。 它遵循与Active Record相同的理念,其主要目标之一是减少映射到这些资源所需的代码量。 这可以通过依赖许多基于代码和协议的约定来实现,这些约定使Active Resource可以轻松地推断出复杂的关系和结构。 ActiveResource :: Base的文档中详细介绍了这些约定。

概观

Active Resource将模型类映射到远程REST资源,与Active Record将模型类映射到数据库表的方式大致相同。 当请求远程资源时,生成,传输REST XML请求,并将结果接收并序列化为可用的Ruby对象。

配置和使用

使用Active Resource与Active Record非常相似。 它就像创建一个inheritance自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资源(可能是也可能不是数据库记录)。

在这里阅读更多......

如果您决定不使用像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 %> 

是的,它可以是一个很好的设计。

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

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

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