问题 使用参数重定向POST / GET请求的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参数?


2238
2017-08-12 07:38


起源

看到 这个帖子 简化解析和格式化。对于POST,您可以随时将它们转换为GET参数,并将服务器端逻辑更改为接受。我不确定你的用例是否有更好的方法。 - Jonah


答案:


对于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

12
2017-08-20 10:36



谢谢,这是真的,更新了代码。 - Konstantin Haase


我会超载 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

2
2017-08-17 20:01



谢谢,这真的有助于GET请求重定向。但是POST重定向呢?我在几个地方读到你无法重定向POST请求,但我也看到状态码303,307和308重定向请求 无 更改HTTP方法... - samvermette
303更改请求,需要使用307(参见我的回答) - Konstantin Haase