Приложение Sinatra, которое перенаправляет запросы POST/GET с параметрами

Я переношу серверы, но, к сожалению, старый IP-адрес сервера жестко закодирован внутри моего iPhone-приложения. Очевидно, я собираюсь представить обновление, которое устанавливает конечную точку API для моего нового сервера, но тем временем мне нужно настроить приложение на старый сервер, который перенаправляет все запросы на новый сервер. Я слышал, что Синатра идеально подходит для этого.

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?

Ответ 1

Для запросов 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

Ответ 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

EDIT (лучшее решение с использованием net/http)

Поместите a require "lib/overload_hash", require "net/http" и require "uri" в <<26 > . Следующий пример можно легко перевести на GET.

post '/foo/bar' do
  uri = URI.parse("http://example.com/search")
  response = Net::HTTP.post_form(uri, params.to_ur_params) 
  response
end