在我的方法中,我正在向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]
答案 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,如魅力。
干杯