sam*_*tte 11 ruby redirect sinatra
我正在迁移服务器,但遗憾的是旧的服务器IP在我的iPhone应用程序中是硬编码的.显然,我将提交一个更新,将API端点设置为我的新服务器,但与此同时,我需要在旧服务器上设置一个应用程序,将所有请求重定向到新服务器.我听说过Sinatra会很完美.
require 'sinatra'
get "/foo/bar" do
redirect "http://new-server.com/foo/bar", 303
end
post "/foo/bar" do
redirect "http://new-server.com/foo/bar", 303
end
Run Code Online (Sandbox Code Playgroud)
问题是这些不会将GET或POST参数与请求一起转发.我在Sinatra文档上读到,你可以直接将它们放入URL(适用于GET请求),或者通过设置会话变量来实现.
手动解析和格式化GET参数以将它们放回重定向URL是获取GET重定向的唯一方法吗?你打算如何转发POST参数?
Kon*_*ase 12
对于GET请求,请使用request.fullpath或request.query_string.对于POST请求,请使用状态代码307,因此后续请求将是具有相同参数的POST.
helpers do
def new_url
"http://new-server.com" + request.fullpath
end
end
get "/foo/bar" do
redirect new_url
end
post "/foo/bar" do
redirect new_url, 307
end
Run Code Online (Sandbox Code Playgroud)
我会重载Hash中的类lib/overload_hash.rb,如下所示:
class Hash
def to_url_params
elements = []
keys.size.times do |i|
elements << "#{keys[i]}=#{values[i]}"
end
elements.join('&')
end
end
Run Code Online (Sandbox Code Playgroud)
编辑(使用 net / http 更好的解决方案)
将require "lib/overload_hash",require "net/http"和require "uri"放在下面require 'sinatra'。下面的例子可以很容易地翻译成GET。
post '/foo/bar' do
uri = URI.parse("http://example.com/search")
response = Net::HTTP.post_form(uri, params.to_ur_params)
response
end
Run Code Online (Sandbox Code Playgroud)