我正在迁移服务器,但不幸的是旧的服务器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
问题是这些不会将GET或POST参数与请求一起转发。我在Sinatra文档中读到,你可以直接将它们放在URL中(适用于GET请求),或者设置会话变量。
手动解析和格式化GET参数以将它们放回重定向URL是获取GET重定向的唯一方法吗?你打算怎么转发POST参数?
答案 0 :(得分: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
答案 1 :(得分:2)
我会在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
编辑(使用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