Rails:从其他站点读取内容

时间:2014-03-05 09:30:23

标签: ruby-on-rails ajax ruby-on-rails-4 amazon-s3

在Rails中,如何向页面发出http请求,例如“http://google.com”并将响应设置为变量?

基本上我正在尝试从Amazon S3获取CSV文件的内容: https://s3.amazonaws.com/datasets.graf.ly/24.csv

My Rails服务器需要将该内容作为对AJAX请求的响应返回。

  1. 获取S3存储桶
  2. 访问该文件并阅读
  3. 渲染其内容(以便ajax请求接收它)
  4. 一些问题提示屏幕抓取,但这听起来有点过分(并且可能很慢)只是简单地做出响应并且几乎只是传递它。

2 个答案:

答案 0 :(得分:1)

API

首先,您需要知道如何访问数据

您引用的问题仅在您通过HTTP(类似CURL)访问某人的网站时才有效。正如你本能地知道的那样,这是非常低效的。可能会阻止您的IP连续访问

访问数据(来自任何信誉良好的服务)的更好方法是使用他们的API。 S3,Twitter,Facebook,Dropbox等也是如此:


AWS-SDK

#GemFile
gem "aws-sdk-core", "~> 2.0.0.rc2"

#config/application.rb
Aws.config = {
    access_key_id: '...',
    secret_access_key: '...',
    region: 'us-west-2'
}

#config/initializers/s3.rb
S3 = Aws::S3.new
S3 = Aws.s3

然后,您将能够使用API resources来帮助检索对象:

#controller
# yields once per response, even works with non-paged requests
s3.list_objects(bucket:'aws-sdk').each do |resp|
  puts resp.contents.map(&:key)
end

CORS

如果您考虑xhr进入服务器,则需要确保您拥有正确的CORS权限

考虑到您想要使用S3,我会查看this documentation以确保您正确设置权限。这不适用于API或HTTP请求(仅限Ajax)

答案 1 :(得分:0)

按照你的要求去做:

或者解码rails中的csv文件并传回json数组:

我的头顶应该是这样的:

def get_csv
  url = 'http://s3.amazonaws.com/datasets.graf.ly/%d.csv' % params[:id].to_i
  data = open(url).read
  # set header here
  render :text => data
end