从 Rails 应用程序使用 REST API
Posted
技术标签:
【中文标题】从 Rails 应用程序使用 REST API【英文标题】:Consuming REST API from Rails Application 【发布时间】:2011-07-20 03:56:31 【问题描述】:我正在构建我的第一个 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 应用程序来说是一个好的设计吗?谢谢!
【问题讨论】:
您能否将杜克的答案标记为正确的答案?我的答案在这些时候是旧的和无效的。 【参考方案1】:ActiveResource 不再包含在 Rails 4.0 中。话说现在它几乎没有维护,并且很难为没有按照“Rails 方式”制定的 REST API 端点进行自定义。
经过一些研究,我非常赞成使用Faraday。它包括对使用不同 HTTP 请求适配器的支持。它可以直接使用 EventMachine,或者当你决定并发时使用像 Typhoeus 这样的库。它还支持类似于 Rack 的中间件,用于无缝地包括身份验证。
对于 Rails 中易于配置的 REST ORM,相对较新(大约一年前)Her 看起来很有前途,并利用了 Faraday。
更新
我完全 RestClient。很简单。如果您需要 ORM 风格的功能,那么您将需要更高级别的抽象,但对于简单地使用 API,您无法超越它的简单性。它只是做了它应该做的事情,没有大惊小怪,有合理的默认值,并且能够设置高级选项,例如 auth headers。
【讨论】:
我也推荐curb
。真快,我见过最快的客户端【参考方案2】:
如果您决定不使用像 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 %>
【讨论】:
请注意,不明确删除未使用的临时文件可能会在文件系统上留下大量临时文件,直到它们被垃圾收集。最好在单独的行中调用open
并在之后关闭返回的 temp。【参考方案3】:
我强烈推荐ActiveResource 来满足您的要求。我对它的体验非常好。如果您打算使用的 API 真的 REST,我认为没有任何更简洁的设计可以通过 REST API 使用数据。从它的自述文件中,
活动资源
活动资源 (ARes) 连接业务对象和 具象状态转移 (REST) 网页服务。它实现 REST Web 的对象关系映射 提供透明的服务 客户端之间的代理功能 (ActiveResource) 和 RESTful 服务 (由 Simply RESTful 提供 路由输入 动作控制器::资源)。
哲学
活动资源尝试 提供一个连贯的包装 REST Web 的对象关系映射 服务。它遵循相同的 作为 Active Record 的哲学,在那个 其主要目标之一是减少 映射到这些所需的代码量 资源。这可以通过 依靠一些代码和 基于协议的约定 活动资源很容易推断 复杂的关系和结构。 这些约定在 文档中的详细信息 ActiveResource::Base.
概述
模型类映射到 Active 远程 REST 资源 资源与活动方式大致相同 记录映射模型类到数据库 表。当一个请求被 远程资源,一个 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...
【讨论】:
我认为杜克的答案现在应该被标记为正确答案。【参考方案4】:是的,它可以是一个很好的设计。
我的建议是阅读“使用 Ruby 和 Rails 的面向服务的设计: http://www.amazon.com/Service-Oriented-Design-Rails-Addison-Wesley-Professional/dp/0321659368
它专注于 Restful Ruby 应用程序,就像您的示例一样,强调可扩展性和性能。它还研究了不同的框架(Rack、Sinatra、Rails)以及它们所扮演的角色。
很遗憾,我自己(还没有!)没有实施这个策略,所以我不能给你任何第一手的建议。
【讨论】:
以上是关于从 Rails 应用程序使用 REST API的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails Paypal REST API 来宾结账
如何在 Rails 应用程序中实现 Paypal Rest API
是否有任何 REST API 可以在 rails 中的 quickblox 中获取在线用户