2013-02-02 54 views
23

पर एपीआई अनुरोधों को प्रतिबंधित करें मैं सभी एपीआई नियंत्रकों को JSON पथ पर रीडायरेक्ट करने के अनुरोधों को प्रतिबंधित करना चाहता हूं। मैं एक रीडायरेक्ट का उपयोग करना चाहता हूं क्योंकि यूआरएल प्रतिक्रिया के अनुसार बदलना चाहिए।
एक विकल्प before_filter का उपयोग करना होगा जो अनुरोध को उसी क्रिया के लिए रीडायरेक्ट करता है लेकिन JSON प्रारूप को मजबूर करता है। उदाहरण अभी तक काम नहीं कर रहा है!रेल: जेएसओएन प्रारूप

# base_controller.rb 
class Api::V1::BaseController < InheritedResources::Base 
    before_filter :force_response_format 
    respond_to :json 
    def force_response_format 
    redirect_to, params[:format] = :json 
    end 
end 

एक और विकल्प मार्ग सेटिंग्स में प्रारूप को प्रतिबंधित करना होगा।

# routes.rb 
MyApp::Application.routes.draw do 
    namespace :api, defaults: { format: 'json' } do 
    namespace :v1 do 
     resources :posts 
    end 
    end 
end 

मैं सभी अनुरोध एक JSON अनुरोध के रूप में खत्म करना चाहते हैं:

http://localhost:3000/api/v1/posts 
http://localhost:3000/api/v1/posts.html 
http://localhost:3000/api/v1/posts.xml 
http://localhost:3000/api/v1/posts.json 
... 

कौन सा कार्यनीति की सलाह देंगे?

उत्तर

5

मार्ग प्रारूप का उपयोग करके दूसरा विकल्प। यदि कोई उपयोगकर्ता स्पष्ट रूप से XML प्रारूप का अनुरोध करता है, तो उसे JSON प्रतिक्रिया प्राप्त नहीं करनी चाहिए। उसे एक संदेश मिलना चाहिए कि यह यूआरएल एक्सएमएल प्रारूप का जवाब नहीं देता है, या 404.

वैसे, यह मेरी राय में आपको जो करना चाहिए, उसे जवाब देना आसान होगा।

class FooController 
    respond_to :xml, :json 
    def show 
    @bar = Bar.find(params[:id]) 
    respond_with(@bar) 
    end 
end 
+0

+1 टिप्पणी की शुरुआत के लिए +1। एक प्रारूप जोड़ना मेरे अनुभव में इतना आसान नहीं है, हालांकि रेल इसे कार्यान्वित करना आसान बनाता है। एपीआई डिजाइनर को अभी भी सभी प्रभावों के साथ एक अतिरिक्त प्रारूप का समर्थन करने के लिए क्या मतलब है, इसके बारे में सोचना है। –

19

अपने मार्गों में डिफ़ॉल्ट सेट करने से सभी अनुरोध JSON अनुरोध में नहीं बदले जाएंगे।

तुम क्या चाहते लगता है कि जो कुछ भी आप प्रतिपादन कर रहे हैं एक JSON प्रतिक्रिया

आप काफी पहले विकल्प में यह था सिवाय आप इस

before_filter :set_default_response_format 

private 
    def set_default_response_format 
    request.format = :json 
    end 

जाना होगा कि क्या करने की जरूरत है सुनिश्चित करने के लिए है आपके बेस एपीआई नियंत्रक के तहत ताकि जब यह आपकी वास्तविक कार्रवाई में हो जाए तो प्रारूप हमेशा JSON होगा।

+0

'request.format' को': json' में सेट करने से समस्या हल हो जाती है कि सभी प्रतिक्रियाएं JSON लौटाती हैं। हालांकि यह एड्रेसबार में यूआरएल नहीं बदलता है। – JJD

+0

यदि आप एक एपीआई कर रहे हैं तो आपको पता बार में यूआरएल क्यों लिखना होगा? ध्यान दें कि रीडायरेक्ट करने से 300 की स्थिति वापस आ जाएगी और शायद यह सबसे कुशल नहीं है, हालांकि मुझे उस पर उद्धरण न दें। –

+0

यह कहा जा रहा है, तो क्या आप किसी भी मामले में JSON को अनुरोध प्रारूप को फिर से लिखने की सलाह देंगे? एक और विकल्प कुछ HTTP स्थिति को मैथियुगने के रूप में वापस करना होगा और आपने उल्लेख किया था। – JJD

16

आप 404, या एक RouteNotFound त्रुटि को बढ़ाने के लिए करता है, तो प्रारूप :json नहीं है चाहते हैं, मैं इस तरह एक मार्ग बाधा जोड़ना होगा:

# routes.rb 
MyApp::Application.routes.draw do 
    namespace :api, constraints: { format: 'json' } do 
    namespace :v1 do 
     resources :posts 
    end 
    end 
end 

अधिक जानकारी:

JSON प्रारूप की आवश्यकता होती है यहां पाया जा सकता है: http://edgeguides.rubyonrails.org/routing.html#request-based-constraints

+0

मैं तर्क दूंगा कि 406 इस मामले में एक और सटीक प्रतिक्रिया है। कोई विचार क्यों यह दृष्टिकोण 404 लौटाता है? – asymmetric