2012-03-08 12 views
12

के साथ base_uri को कैसे स्विच करें मैं login विधि पर पैरामीटर पास करने का प्रयास कर रहा हूं और मैं उस पैरामीटर के आधार पर बेस यूरी को स्विच करना चाहता हूं।httparty

तो जैसा:

class Managementdb 
    include HTTParty 

    def self.login(game_name) 
     case game_name 
     when "game1" 
      self.base_uri = "http://game1" 
     when "game2" 
      self.base_uri = "http://game2" 
     when "game3" 
      self.base_uri = "http://game3" 
     end 

    response = self.get("/login") 

     if response.success? 
     @authToken = response["authToken"] 
    else 
     # this just raises the net/http response that was raised 
     raise response.response  
    end 
    end 

    ... 

बेस uri निर्धारित नहीं करता है जब मैं एक विधि से यह कहते हैं, कैसे मुझे लगता है कि काम करने के लिए मिलता है?

उत्तर

14

HTTParty में, base_uri एक वर्ग विधि जो एक आंतरिक विकल्प हैश सेट करता है। अपनी कस्टम क्लास विधि login के भीतर से गतिशील रूप से इसे बदलने के लिए आप इसे केवल एक विधि के रूप में कॉल कर सकते हैं (इसे असाइन नहीं करते जैसे कि यह एक चर था)।

उदाहरण के लिए, ऊपर अपने कोड को बदलने, इस base_uri स्थापित करना चाहिए आपकी अपेक्षा के अनुसार:

... 
case game_name 
    when "game1" 
    # call it as a method 
    self.base_uri "http://game1" 
... 

आशा है कि यह मदद करता है।

+0

ऐसा लगता है कि यह काम कर रहा है :) धन्यवाद। –

+0

यदि आपको अपनी प्रारंभिक() विधि में मिक्सिन की क्लास विधि कॉल करने की आवश्यकता है, तो आपको 'YourClassName.mixin_class_method' को कॉल करने की आवश्यकता है। – spier

+19

मेरी 'प्रारंभिक विधि' विधि में मुझे 'self.class.base_uri "http://example.com" को कॉल करने के लिए कॉल करना पड़ा। – hamstar

8

मैं अभी तक टिप्पणी नहीं कर सकता, इसलिए यहां एस्टानिस्ला ट्रेपेट के उत्तर का विस्तार है।

अनुसार वर्ग विधि सभी अपने कॉलbase_uriके लिए सेट करने के लिए कॉल करें:

self.base_uri "http://api.yourdomain.com" 

आप अलग URI को केवल कुछ कॉल भेजने का एक तरीका है और राज्य से बचना चाहते हैं त्रुटियों आप निम्नलिखित सहायक इस्तेमाल कर सकते हैं (मूल यूआरआई पर बदलने में भूल):

def self.for_uri(uri) 
    current_uri = self.base_uri 
    self.base_uri uri 
    yield 
    self.base_uri current_uri 
end 

ऊपर सहायक के साथ, आप विशिष्ट कॉल ओ करने के लिए कर सकते हैं की तरह वहाँ यूआरआई निम्नलिखित:

for_uri('https://api.anotheruri.com') do 
    # your httparty calls to another URI 
end 
+1

मुझे यह दृष्टिकोण बहुत पसंद है। हालांकि, यह महत्वपूर्ण नहीं है कि यह 'base_uri' को इसके वापसी मूल्य के रूप में वापस कर देगा। अगर आपको रिटर्न वैल्यू के साथ कुछ करने की ज़रूरत है तो इससे मदद नहीं मिलेगी। इसे सुधारने के लिए, 'प्रतिक्रिया = उपज' और उसके बाद httparty कॉल – jsookiki

+1

से प्रतिक्रिया मान वापस करने के लिए अंतिम पंक्ति के रूप में 'प्रतिक्रिया' है, मुझे यह दृष्टिकोण भी पसंद है, और इसका उपयोग किया गया ... और फिर एक और चीज़ को एहसास हुआ।यदि आपके 'उपज' के परिणाम अपवाद में हैं, तो आपकी 'base_uri'' अस्थायी 'base_uri' के साथ "अटक" हो जाएगी! इसलिए यह सुनिश्चित करने के लिए 'प्रारंभ/बचाव/सुनिश्चित करें' ब्लॉक का उपयोग करके कि अपवाद के मामले में भी आपका 'self.base_uri' पुनर्स्थापित किया जाएगा, एक अच्छा विचार है। – nicedawg

1

मुझे विश्वास है यह लागू किया गया था जब यह सवाल पहले कहा गया था नहीं कर रहा हूँ, लेकिन आप सेट या, HTTParty अनुरोध एक प्रति का अनुरोध या प्रति-उदाहरण के आधार पर :base_uri ओवरराइड करने के लिए चाहते हैं, तो क्लास विकल्पों को ओवरराइड करने के लिए विधियां (: प्राप्त करें, पोस्ट करें, आदि) accept options

तो ओपी के उदाहरण के लिए, यह कुछ इस तरह दिख सकता है:

class Managementdb 
    include HTTParty 

    # If you wanted a default, class-level base_uri, set it here: 
    base_uri "http://games" 

    def self.login(game_name) 
    base_uri = 
     case game_name 
     when "game1" then "http://game1" 
     when "game2" then "http://game2" 
     when "game3" then "http://game3" 
     end 

    # To override base_uri for an individual request, pass 
    # it as an option: 
    response = get "/login", base_uri: base_uri 

    # ... 
    end 
end 

गतिशील वर्ग विधि कॉलिंग, के रूप में अन्य उत्तर में से कुछ में सुझाव दिया, सभी अनुरोधों के लिए base_uri, जो शायद है बदल जाता है आप क्या चाहते हैं नहीं। यह निश्चित रूप से थ्रेड-सुरक्षित नहीं है।

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