2012-08-12 65 views
11

私はサーバーを移行していますが、残念ながら古いサーバーIPはiPhoneアプリケーション内でハードコードされています。 APIエンドポイントを新しいサーバーに設定する更新プログラムを提出する予定ですが、その間に新しいサーバーにすべての要求をリダイレクトする古いサーバーにアプリケーションをセットアップする必要があります。私はシナトラがこれに完璧だと聞いた。パラメータを使用してPOST/GETリクエストをリダイレクトする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パラメータをどのように転送する必要がありますか?

+0

解析および書式設定を容易にする[このポスト(http://stackoverflow.com/questions/798710/how-to-turn-a-ruby-hash-into-http-params)を参照してください。 POSTに関しては、いつでもGETパラメーターに変換し、サーバー側のロジックを変更してどちらかを受け入れることができます。あなたのユースケースにとってより良い方法があるかどうかはわかりません。 – Jonah

答えて

2

私はそうのように、lib/overload_hash.rbHashクラスをオーバーロードします:require 'sinatra'

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

EDIT(ネット/ HTTPを使用して、よりよい解決策)

場所require "lib/overload_hash"require "net/http"require "uri"。次の例は、GETに簡単に変換できます。 GETリクエスト、使用request.fullpathまたはrequest.query_stringについては

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

ありがとう、それは本当にGET要求のリダイレクトに役立ちます。しかし、POSTリダイレクトはどうですか?私はいくつかの場所でPOSTリクエストをリダイレクトできないことを読んでいますが、HTTPメソッドを変更せずに**ステータスコード303,307、および308がリクエストをリダイレクトしていることも確認しました... – samvermette

+1

303リクエストを変更すると、 307を使用する必要があります(私の答えを参照) –

12

。 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 
+1

ありがとう、それは本当です、コードを更新しました。 –

関連する問題