11

我正在迁移服务器,但不幸的是,旧的服务器 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 参数?

4

2 回答 2

12

对于 GET 请求,使用request.fullpathor 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
于 2012-08-20T10:36:46.937 回答
2

我会重载中的Hashlib/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
于 2012-08-17T20:01:05.190 回答