我有一个基于Sinatra的REST服务应用程序,我想从一个路由中调用其中一个资源,从另一个路由中有效地组成一个资源.例如.
get '/someresource' do otherresource = get '/otherresource' # do something with otherresource,return a new resource end get '/otherresource' do # etc. end
重定向将不起作用,因为我需要对第二个资源进行一些处理,并从中创建一个新的资源.显然我可以a)使用RestClient或其他一些客户端框架,或者b)结构化我的代码,所以其他资源的所有逻辑都是一个方法,只是调用它,但是,如果我可以只是重新使用我们的资源从Sinatra使用他们的DSL.
解决方法
我能够通过快速肮脏的机架请求并直接调用Sinatra(机架应用程序)应用程序来骇客.它不漂亮,但它的作品.请注意,将生成此资源的代码提取为辅助方法可能会更好,而不是像这样做.但是这是可能的,而且可能会比这更好,更干净的做法.
#!/usr/bin/env ruby require 'rubygems' require 'stringio' require 'sinatra' get '/someresource' do resource = self.call( 'REQUEST_METHOD' => 'GET','PATH_INFO' => '/otherresource','rack.input' => StringIO.new )[2].join('') resource.upcase end get '/otherresource' do "test" end
如果您想了解更多关于幕后发生的事情,我已经写了几篇关于Rack基本知识的文章.有What is Rack?和Using Rack.