2012-08-12 3 views
11

서버를 이전 중이지만 유감스럽게도 기존 서버 IP는 iPhone 앱에 하드 코드됩니다. 분명히 API 엔드 포인트를 새 서버로 설정하는 업데이트를 제출 하겠지만, 그 동안 모든 요청을 새 서버로 리디렉션하는 이전 서버에 앱을 설정해야합니다. 나는 Sinatra가 이것을 완벽하게한다고 들었습니다.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 doc에서 URL에 직접 입력 (GET 요청에 대해 작동)하거나 세션 변수를 설정하여이를 수행 할 수 있음을 읽었습니다.

GET 매개 변수를 수동으로 구문 분석하고 서식을 지정하여 GET 리디렉션을위한 유일한 방법 인 리디렉션 URL에 다시 넣을 수 있습니까? POST 매개 변수를 전달하는 방법은 무엇입니까?

+0

보기 [이 포스트 (http://stackoverflow.com/questions/798710/how-to-turn-a-ruby-hash-into-http-params) 파싱 및 포맷을 용이하게한다. POST의 경우, 항상 GET 매개 변수로 변환 할 수 있으며, 서버 측 로직을 변경하여이를 수용 할 수도 있습니다. 나는 당신의 유스 케이스를위한 더 좋은 방법이 있는지 확신하지 못한다. – Jonah

답변

2

나는과 같이, lib/overload_hash.rbHash 클래스를 오버로드 것 :

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"require 'sinatra'에서. 다음 예제는 GET으로 쉽게 변환 할 수 있습니다.

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

고마워, 그게 정말 GET 요청 리디렉션에 도움이됩니다. 그러나 POST 리디렉션은 어떻게됩니까? 두 곳에서 POST 요청을 리디렉션 할 수 없다는 것을 읽었지만 상태 코드 303, 307 및 308은 HTTP 메소드를 변경하지 않고 ** 리디렉션했습니다 ** ... – samvermette

+1

303 요청을 변경하면 307 사용 (내 대답을 참조하십시오) –

12

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

고마워, 그건 사실, 코드를 업데이 트됩니다. –

관련 문제