2012-08-12 11 views
11

Estoy migrando servidores, pero desafortunadamente el IP del servidor anterior está codificado dentro de mi aplicación de iPhone. Obviamente, voy a enviar una actualización que establece el punto final de la API a mi nuevo servidor, pero mientras tanto, tengo que configurar una aplicación en el viejo servidor que redirige todas las solicitudes al nuevo servidor. Escuché que Sinatra sería perfecto para esto.Aplicación Sinatra que redirige las solicitudes POST/GET con los parámetros

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 

El problema es que estos no envían los parámetros GET o POST junto con la solicitud. Leí en el documento de Sinatra que puede hacer eso poniéndolos en la URL directamente (funciona para las solicitudes GET) o estableciendo variables de sesión.

¿Está analizando y formateando manualmente los parámetros GET para colocarlos de nuevo en la URL de redirección, la única manera de obtener los redireccionamientos GET? ¿Cómo se supone que debes enviar los parámetros POST?

+0

Ver [este mensaje] (http://stackoverflow.com/questions/798710/how-to-turn-a-ruby-hash-into-http-params) para facilitar el análisis y el formato. En cuanto a POST, siempre puedes convertirlos en parámetros GET, y cambiar la lógica del lado del servidor para aceptar cualquiera. No estoy seguro de si hay una mejor manera para su caso de uso. – Jonah

Respuesta

2

que sobrecargaría la clase Hash en lib/overload_hash.rb, así:

class Hash 
    def to_url_params 
    elements = [] 
    keys.size.times do |i| 
     elements << "#{keys[i]}=#{values[i]}" 
    end 
    elements.join('&') 
    end 
end 

EDITAR (Mejor solución utilizando net/http)

Coloque un require "lib/overload_hash", require "net/http" y require "uri"require 'sinatra' bajo. El siguiente ejemplo se puede traducir fácilmente al GET.

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

Gracias, eso realmente ayuda a la redirección de solicitudes GET. Pero, ¿qué pasa con la redirección POST? Leí en un par de lugares que no puede redirigir las solicitudes POST, pero también vi que los códigos de estado 303, 307 y 308 redirigen una solicitud ** sin ** cambiar el método HTTP ... – samvermette

+1

303 cambia la solicitud, usted necesita usar 307 (ver mi respuesta) –

12

Para peticiones GET, utilice request.fullpath o request.query_string. Para la solicitud POST, use el código de estado 307, por lo que la solicitud posterior será una POST con los mismos parámetros.

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

Gracias, es cierto, actualizó el código. –

Cuestiones relacionadas