Это на самом деле возможно. Однако вам необходимо убедиться, что вызываемые вами службы не вызывают друг друга рекурсивно.
Действительно простое промежуточное программное обеспечение Rentrant может работать следующим образом:
class Reentry < Struct.new(:app)
def call(env)
@current_env = env
app.call(env.merge('reentry' => self)
end
def call_rack(request_uri)
env_for_recursive_call = @current_env.dup
env_for_recursive_call['PATH_INFO'] = request_uri # ...and more
status, headers, response = call(env_for_recursive_call)
# for example, return response as a String
response.inject(''){|part, buf| part + buf }
end
end
Тогда в коде вызова:
env['reentry'].call_rack('/my/api/get-json')
Очень правильным вариантом использования для этого является загрузка ответов API в JSON.
формат на главной странице.
Очевидно, что успех этой техники будет зависеть от сложности
вашего стека Rack (так как некоторые части Rack env не любят повторного использования).