说我有存储在S3一些HTML文档喜欢这样的:
- http://alan.aws-s3-bla-bla.com/posts/1.html
- http://alan.aws-s3-bla-bla.com/posts/2.html
- http://alan.aws-s3-bla-bla.com/posts/3.html
- http://alan.aws-s3-bla-bla.com/posts/1/comments/1.html
- http://alan.aws-s3-bla-bla.com/posts/1/comments/2.html
- http://alan.aws-s3-bla-bla.com/posts/1/comments/3.html
- 等等,等等。
我想与齿条(优选西纳特拉)应用程序为这些,映射以下路线:
get "/posts/:id" do
render "http://alan.aws-s3-bla-bla.com/posts/#{params[:id]}.html"
end
get "/posts/:posts_id/comments/:comments_id" do
render "http://alan.aws-s3-bla-bla.com/posts/#{params[:posts_id]}/comments/#{params[:comments_id}.html"
end
这是一个好主意吗? 我会怎么做呢?
有显然是等待,而你抓住的文件,所以你可以缓存,或设置的ETag等,以帮助这一点。 我想这取决于你要等待多久,以及它被访问,它的大小等它是否值得保存在本地或远程的HTML。 只有你可以的工作,有点出入。
如果该块中的最后一个表达式是,它会自动呈现一个字符串,所以没有必要调用render
只要你打开该文件作为一个字符串。
以下是如何抓住一个外部文件,并把它变成一个临时文件:
require 'faraday'
require 'faraday_middleware'
#require 'faraday/adapter/typhoeus' # see https://github.com/typhoeus/typhoeus/issues/226#issuecomment-9919517 if you get a problem with the requiring
require 'typhoeus/adapters/faraday'
configure do
Faraday.default_connection = Faraday::Connection.new(
:headers => { :accept => 'text/plain', # maybe this is wrong
:user_agent => "Sinatra via Faraday"}
) do |conn|
conn.use Faraday::Adapter::Typhoeus
end
end
helpers do
def grab_external_html( url )
response = Faraday.get url # you'll need to supply this variable somehow, your choice
filename = url # perhaps change this a bit
tempfile = Tempfile.open(filename, 'wb') { |fp| fp.write(response.body) }
end
end
get "/posts/:whatever/" do
tempfile = grab_external_html whatever # surely you'd do a bit more here…
tempfile.read
end
这可能会实现。 您可能还需要考虑关闭该临时文件,但是垃圾收集器和OS 应该照顾它。