2012-08-12 10 views
11

के साथ POST/GET अनुरोधों को रीडायरेक्ट करता है मैं सर्वर माइग्रेट कर रहा हूं लेकिन दुर्भाग्यवश पुराने सर्वर आईपी को मेरे आईफोन ऐप के अंदर हार्डकोड किया गया है। जाहिर है, मैं एक अद्यतन सबमिट करने जा रहा हूं जो मेरे नए सर्वर पर एपीआई एंडपॉइंट सेट करता है, लेकिन इस बीच मुझे पुराने सर्वर पर एक ऐप सेट करने की आवश्यकता है जो सभी अनुरोधों को नए सर्वर पर रीडायरेक्ट करता है। मैंने सुना है कि सिनात्रा इसके लिए सही होगा।सिनात्रा ऐप जो पैरामीटर

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 

समस्या यह है कि ये अनुरोध के साथ जीईटी या पोस्ट पैरामीटर को आगे नहीं बढ़ाते हैं। मैंने सिनात्रा दस्तावेज़ पर पढ़ा है कि आप उन्हें सीधे यूआरएल में डालकर (जीईटी अनुरोधों के लिए काम करता है), या सत्र चर सेट करके कर सकते हैं।

मैन्युअल रूप से रीडायरेक्ट यूआरएल में रीडायरेक्ट यूआरएल रीडायरेक्ट के लिए जाने का एकमात्र तरीका है ताकि उन्हें रीडायरेक्ट यूआरएल में वापस लाने के लिए जीईटी पैराम को पार्सिंग और स्वरूपित किया जा सके? आपको POST पैरामीटर को कैसे आगे बढ़ाना है? एक require "lib/overload_hash", require "net/http" और require "uri"require 'sinatra' के तहत (का उपयोग कर शुद्ध/http बेहतर समाधान)

प्लेस

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

संपादित करें:

+0

सी [इस पोस्ट] (http://stackoverflow.com/questions/798710/how-to-turn-a-ruby-hash-into-http-params) पार्स करने और स्वरूपण को कम करने। पोस्ट के लिए, आप उन्हें हमेशा जीईटी पैराम में बदल सकते हैं, और स्वीकार करने के लिए अपने सर्वर साइड लॉजिक को बदल सकते हैं। मुझे यकीन नहीं है कि आपके उपयोग के मामले में कोई बेहतर तरीका है या नहीं। – Jonah

उत्तर

2

मैं lib/overload_hash.rb में Hash वर्ग ओवरलोड होगा, इसलिए पसंद है। निम्नलिखित उदाहरण को 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

धन्यवाद, यह वास्तव में अनुरोध पुनर्निर्देशन के लिए मदद करता है। लेकिन पोस्ट पुनर्निर्देशन के बारे में क्या? मैंने कुछ स्थानों पर पढ़ा है कि आप POST अनुरोधों को पुनर्निर्देशित नहीं कर सकते हैं, लेकिन मैंने यह भी देखा कि स्थिति कोड 303, 307 और 308 एक अनुरोध को पुनर्निर्देशित ** बिना ** ** HTTP विधि को बदल रहा है ... – samvermette

+1

303 अनुरोध बदलता है, आप 307 का उपयोग करने की आवश्यकता है (मेरा जवाब देखें) –

12

प्राप्त अनुरोधों के लिए, request.fullpath या request.query_string का उपयोग करें। POST अनुरोध के लिए, स्थिति कोड 307 का उपयोग करें, इसलिए बाद का अनुरोध उसी पैरामीटर के साथ एक पोस्ट होगा।

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

धन्यवाद, यह सच है, कोड को अपडेट किया गया। –

संबंधित मुद्दे