从Rails应用程序中使用REST API

lic*_*rna 26 api rest web-applications ruby-on-rails

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

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

https://api.example.com/v1/users/feature-xxx [GET]
Run Code Online (Sandbox Code Playgroud)

我希望我的网络应用程序有一个像这样的页面:

https://example.com/feature
Run Code Online (Sandbox Code Playgroud)

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

问题是:

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

谢谢!

Duk*_*uke 31

ActiveResource不再包含在Rails 4.0中.Word现在几乎没有维护,并且很难为不按照"Rails方式"制定的REST API端点进行自定义.

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

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

更新

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


Chi*_*tan 21

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

活跃资源

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

哲学

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

概观

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

配置和使用

使用Active Resource与Active Record非常相似.它就像创建一个继承自ActiveResource :: Base并为其提供网站类变量的模型类一样简单:

class Person < ActiveResource::Base  
  self.site = "http://api.people.com:3000/" 
end 
Run Code Online (Sandbox Code Playgroud)

现在,Person类已启用REST,并且可以调用REST服务,与Active Record调用针对持久性存储操作的生命周期方法的方式非常相似.

# Find a person with id = 1 
ryan = Person.find(1) 
Person.exists?(1)  # => true 
Run Code Online (Sandbox Code Playgroud)

如您所见,这些方法与Active Record处理数据库记录的方法非常相似.但是,您不是直接处理数据库记录,而是处理HTTP资源(可能是也可能不是数据库记录).

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


Eri*_*ric 7

如果您决定不使用HTTP客户端库像法拉第或HTTParty,您可以使用开放式的URI从您的需要和使用JSON解析它的端点获取数据.

要求:open-uri和json

在控制器中:

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

在视图中:

<% @people.each do |person| %>
    Name:<%= person[:name] %>
    Age:<%= person[:age] %>
<% end %>
Run Code Online (Sandbox Code Playgroud)