11

サーバーを移行していますが、残念ながら古いサーバーの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パラメータをどのように転送することになっていますか?

4

2 に答える 2

12

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
于 2012-08-20T10:36:46.937 に答える
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

編集(ネット/ httpを使用したより良いソリューション)

require "lib/overload_hash"require "net/http"およびrequire "uri"の下に配置しrequire 'sinatra'ます。次の例は、簡単に翻訳GETできます。

post '/foo/bar' do
  uri = URI.parse("http://example.com/search")
  response = Net::HTTP.post_form(uri, params.to_ur_params) 
  response
end
于 2012-08-17T20:01:05.190 に答える