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

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.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
Run Code Online (Sandbox Code Playgroud)


bri*_*lez 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
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)