2012-08-12 5 views
11

Ich migriere Server, aber leider ist die alte Server-IP in meiner iPhone-App fest codiert. Offensichtlich werde ich ein Update einreichen, das den API-Endpunkt auf meinen neuen Server setzt, aber in der Zwischenzeit muss ich eine App auf dem alten Server einrichten, die alle Anfragen auf den neuen Server umleitet. Ich habe gehört, Sinatra wäre perfekt dafür.Sinatra-App, die POST/GET-Anfragen mit Parametern weiterleitet

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 

Das Problem ist, dass diese die GET- oder POST-Parameter nicht zusammen mit der Anfrage weiterleiten. Ich habe auf dem Sinatra-Dokument gelesen, dass Sie das tun können, indem Sie sie direkt in die URL setzen (funktioniert für GET-Anfragen), oder indem Sie Sitzungsvariablen setzen.

Manuelles Parsen und Formatieren der GET-Parameter, um sie wieder in die Weiterleitungs-URL zu setzen, ist die einzige Möglichkeit für GET-Weiterleitungen. Wie sollen Sie POST-Parameter weiterleiten?

+0

See [Dieser Beitrag] (http://stackoverflow.com/questions/798710/how-to-turn-a-ruby-hash-into-http-params) die Analyse und Formatierung zu erleichtern. Wie bei POST könnten Sie sie immer in GET-Parameter umwandeln und Ihre serverseitige Logik ändern, um beides zu akzeptieren. Ich bin mir nicht sicher, ob es einen besseren Weg für Ihren Anwendungsfall gibt. – Jonah

Antwort

2

würde ich die Hash Klasse in lib/overload_hash.rb, überlastet wie so:

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

EDIT (Bessere Lösung mit net/http)

Platz ein require "lib/overload_hash", require "net/http" und require "uri" unter require 'sinatra'. Das folgende Beispiel kann leicht in GET übersetzt werden.

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

Danke, das hilft wirklich bei der GET-Anfrageumleitung. Aber was ist mit POST-Umleitung? Ich habe an einigen Stellen gelesen, dass Sie POST-Anfragen nicht umleiten können, aber ich habe auch gesehen, dass die Statuscodes 303, 307 und 308 eine Anfrage umleiten ** ohne ** die HTTP-Methode zu ändern ... – samvermette

+1

303 ändert die Anfrage, Sie muss 307 verwenden (siehe meine Antwort) –

12

Für GET-Anfragen verwenden request.fullpath oder request.query_string. Verwenden Sie für die POST-Anforderung den Statuscode 307, damit die nachfolgende Anforderung ein POST mit denselben Parametern ist.

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

Danke, das stimmt, den Code aktualisiert. –