从Rails中的CURL命令访问CSV文件

时间:2015-07-24 20:08:49

标签: ruby-on-rails ruby csv curl

在我的方法中,我正在向API端点发出GET请求,作为响应,我可以看到它发送一个CSV文件。

我不知道如何访问此文件,同时,在此请求之后我还需要将其保存到我的模型中。

响应标题:

HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Disposition: attachment;filename=2015-07-14-12-05-08-10-frames.csv
Content-Type: text/csv; charset=UTF-8
Date: Fri, 24 Jul 2015 18:46:21 GMT
Server: nginx/1.6.2
Version: 4.1.0
Content-Length: 752
Connection: keep-alive

这是我正在尝试的代码的和平:

def test_csv
  @csv_response = `curl -i -X GET https://api.example.com/some-ID -H 'Authorization: XXXX-XXXX-XXXX-XX'`

  CSV.foreach("....csv", headers: true) do |row|
    # do something
  end
  # puts "#{@csv_response}"
  render text: "Nothing"
end

那么,基本上代替"....csv"我应该写什么来访问这个CSV文件?

我尝试过的事情:

  • @csv_response[:filename]
  • @csv_response.filename
  • @csv_response[:content-disposition]

2 个答案:

答案 0 :(得分:2)

默想这些:

require 'sinatra'

get '/' do
  "1,2,3,4,5\n6,7,8,9,10\n"
end

require 'open-uri'
require 'csv'

CSV.parse(open('http://localhost:4567/').read)
# => [["1", "2", "3", "4", "5"], ["6", "7", "8", "9", "10"]]

将第一个保存到磁盘并运行它。 Sinatra将创建一个小型Web服务器并等待/的GET请求,并返回两个CSV记录。

将第二个保存到磁盘并运行它。 OpenURI将连接到在您的计算机上运行的Sinatra,请求/并将响应的正文返回到CSV,它将解析它,返回一个数组数组。此时,您可以使用数据执行任何操作。

使用 Cntrl + C 来停止Sinatra。

以这种方式使用Sinatra可以非常轻松地测试必须访问服务器的代码。您可以控制连接的两端,这样您就可以轻松地尝试并查看它们的工作方式。

您可以从命令行使用curl,但一般来说,使用Ruby附带的OpenURI或许多other HTTP clients之一更容易。 libCurl被其他几个宝石使用,它们提供了curl的许多功能。 curl中的深奥功能可能会丢失,因此您可能会被迫使用命令行版本,但可能性很高,您可以使用其中一个普通客户端执行您想要的操作。

答案 1 :(得分:1)

要在本地下载文件,您可以这样做:

c = Curl::Easy.perform(url)
open(filename, "w") do |file|
   file.write(c.body_str)
end

其中filename是要写入的文件的完整路径。并将其作为您要下载的csv文件的URL。

关于将文件保存到模型的第二个问题,我建议您使用处理附件的paperclip gem,如魅力。

干杯