Sinatra应用程序使用参数重定向POST / GET请求

时间:2012-08-12 07:38:27

标签: 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

问题是这些不会将GET或POST参数与请求一起转发。我在Sinatra文档中读到,你可以直接将它们放在URL中(适用于GET请求),或者设置会话变量。

手动解析和格式化GET参数以将它们放回重定向URL是获取GET重定向的唯一方法吗?你打算怎么转发POST参数?

2 个答案:

答案 0 :(得分:12)

对于GET请求,请使用request.fullpathrequest.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