【问题标题】:Connecting to web services using Rails (HTTP requests)?使用 Rails(HTTP 请求)连接到 Web 服务?
【发布时间】:2011-06-29 22:51:20
【问题描述】:

我正在使用 Ruby on Rails 3,并且正在尝试实现 API 以从 Web 服务中检索帐户信息。也就是说,我想连接到具有 Account 类的 Web 服务,并从路由到 URI http://<site_name>/accounts/1show 操作获取信息。

此时,在web服务accounts_controller.rb文件中我有:

class AccountsController < ApplicationController
  def show
    @account = Account.find(params[:id])

    respond_to do |format|
      format.html
      format.js
      format.json { render :json => @account.to_json }
    end
  end
end

现在我需要一些关于连接到 Web 服务的建议。在客户端应用程序中,我应该有一个 HTTP GET 请求,但这是我的问题:连接到发出 HTTP 请求的 Web 服务的“最佳”方法是什么?

客户端应用程序中的此代码有效:

url = URI.parse('http://<site_name>/accounts/1.json')
req = Net::HTTP::Get.new(url.path)
res = Net::HTTP.start(url.host, url.port) {|http|
  http.request(req)
}

@output = JSON(res.body)["account"]

但是,上面的代码是实现 API 的“方式”吗?

是否建议使用第三方插件和 gem?

【问题讨论】:

    标签: ruby-on-rails ruby api ruby-on-rails-3 connection


    【解决方案1】:

    是的,因为您使用的是RESTful 路由,它们是您的基本 API。您还将返回结构化 JSON 数据,应用程序可以轻松使用这些数据。

    还有其他方法可以实现 Web 服务 API(例如 SOAP),但这是一种很好且正确的方法。

    由于它是一个 Web 服务 API,因此连接到正确的 URL 并解析响应是客户端的方式。但是,如果您需要访问许多不同的资源,那么创建一种灵活的方式来构建请求 URL 可能是个好主意。

    【讨论】:

    • 使用'net/http'(需要'net/http')好还是建议使用第三方插件和gem?
    • 我看不出有什么理由不这样做,我不确定会使用什么库。
    【解决方案2】:

    如果您不需要 Net::HTTP 提供的低级调整功能,请考虑使用 Ruby 附带的 Open-URI。它使请求页面和接收正文变得容易。 Open-URI 没有所有的花里胡哨,但对于我所做的很多事情来说,它都很好。

    一个简单的用法如下:

    require 'open-uri'
    body = open('http://www.example.com').read
    

    文档还有许多其他示例。

    这些是我喜欢的其他 HTTP 客户端:

    它们更易于调整,如果您需要,它们可以一次处理多个连接。例如,Typhoeus 有一套简化的调用,类似于 Open-URI 的。来自文档:

    response = Typhoeus::Request.get("http://www.pauldix.net")
    response = Typhoeus::Request.head("http://www.pauldix.net")
    response = Typhoeus::Request.put("http://localhost:3000/posts/1", :body => "whoo, a body")
    response = Typhoeus::Request.post("http://localhost:3000/posts", :params => {:title => "test post", :content => "this is my test"})
    response = Typhoeus::Request.delete("http://localhost:3000/posts/1")
    

    HTTPClient 也有类似的缩短方法。

    【讨论】:

    【解决方案3】:

    我建议在大多数情况下使用 Rails 的ActiveResource。做不到这一点,httparty

    【讨论】:

      【解决方案4】:

      如果您只需要一种简单的方法来获取基于休息的资源,我会使用 ActiveResource。它已经包含在 rails 中并且设置起来非常简单。您只需在 ActiveResource 子类中指定一个基本 url 和资源名称,然后您就可以使用类似于 ActiveRecord 的接口对基于 rest 的资源进行 CRUD。

      【讨论】:

        【解决方案5】:

        rest-client 是最流行的 gem,可以轻松连接到 RESTful Web 服务

        【讨论】:

        • 它很受欢迎。 “最受欢迎”?我需要看到证据。
        • 这并不能证明它是最常用的,只是下载了很多。除非每个客户“打电话回家”到一个公正的指标收集站点,或者发送可以从 HTTPd 日志中收集的唯一标识,否则没有使用指标,我知道他们不会这样做。说它很受欢迎是因为它被大量下载并不过分有用。它可能会被大量下载,因为它们会进行增量更新,迫使大量 gem update 请求。没有披露基本指标的数字意义不大。每个客户端库的连接数将是更好的衡量标准。
        • @theTinMan - 所以你宁愿使用虚构的使用指标而不是真实世界的下载指标?祝你好运;)。 (仅供参考,关于增量更新,它的版本实际上少于接下来的两个下载次数最多的客户端。)
        • 弄清楚如何包含 OpenURI 的真实指标,它会是准确的。 OpenURI 可能是其中最常用的;它方便、易于使用,并且可以构建和内置。
        • @theTinMan - OpenURI 仅支持 GET 请求,因此它不符合 REST 客户端的条件。 (有一个项目叫rest-open-uri,但不是很流行)
        【解决方案6】:

        我认为最好的解决方案之一是Her gem。它封装了 restful 请求,为对象提供了类似活动记录的行为。

        【讨论】:

          猜你喜欢
          • 2017-07-28
          • 1970-01-01
          • 1970-01-01
          • 2020-09-27
          • 1970-01-01
          • 2017-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多