2012-08-12 9 views
11

Sto migrando i server ma sfortunatamente il vecchio IP del server è codificato nella mia app per iPhone. Ovviamente ho intenzione di inviare un aggiornamento che imposta l'endpoint API sul mio nuovo server, ma nel frattempo ho bisogno di configurare un'app sul vecchio server che reindirizza tutte le richieste al nuovo server. Ho sentito che Sinatra sarebbe perfetto per questo.App Sinatra che reindirizza le richieste POST/GET con i parametri

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 

Il problema è che questi non inoltrano i parametri GET o POST insieme alla richiesta. Ho letto sul documento di Sinatra che puoi farlo inserendoli direttamente nell'URL (funziona per le richieste GET) o impostando le variabili di sessione.

È l'analisi e la formattazione manuale dei parametri GET per reinserirli nell'URL di reindirizzamento? L'unico modo per ottenere i reindirizzamenti GET? Come si suppone di inoltrare i parametri POST?

+0

Sede [questo post] (http://stackoverflow.com/questions/798710/how-to-turn-a-ruby-hash-into-http-params) per facilitare l'analisi e la formattazione. Per quanto riguarda i POST, puoi sempre trasformarli in parametri GET e modificare la logica lato server per accettarli entrambi. Non sono sicuro se c'è un modo migliore per il tuo caso d'uso. – Jonah

risposta

2

vorrei sovraccaricare la classe Hash in lib/overload_hash.rb, in questo modo:

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

EDIT (migliore soluzione utilizzando net/http)

Posizionare un require "lib/overload_hash", require "net/http" e require "uri" sotto require 'sinatra'. Il seguente esempio può essere tradotto facilmente in 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

Grazie, questo è di grande aiuto per il reindirizzamento delle richieste GET. Ma che dire del reindirizzamento POST? Ho letto in un paio di punti che non è possibile reindirizzare le richieste POST, ma ho visto anche che i codici di stato 303, 307 e 308 reindirizzano una richiesta ** senza ** cambiando il metodo HTTP ... – samvermette

+1

303 cambia la richiesta, tu ho bisogno di usare 307 (vedi la mia risposta) –

12

per le richieste GET, utilizzare request.fullpath o request.query_string. Per la richiesta POST, utilizzare il codice di stato 307, quindi la richiesta successiva sarà un POST con gli stessi parametri.

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

Grazie, è vero, ho aggiornato il codice. –

Problemi correlati