2012-08-02 10 views
6

मैं रेल 3.2 अनुप्रयोग के लिए मॉडल के रूप में JSON सेवा का उपयोग कैसे कर सकता हूं?रेल मॉडल के रूप में JSON सेवा का उपयोग

मैं जेएसओएन अनुरोधों के लिए मॉडल विधियों को लिंक करना चाहता हूं, उदा।

  • MyModel.create एक रिकॉर्ड को पुनः प्राप्त करने और एक मॉडल वस्तु

क्या पसंदीदा तरीका है में JSON उत्तर डिकोड करने के लिए एक JSON अनुरोध उत्पन्न करने के लिए एक नया रिकार्ड

  • MyModel.find बनाने के लिए एक JSON अनुरोध उत्पन्न करने के लिए इस प्रकार की कार्यक्षमता बनाने के लिए? एक विकल्प जिसे मैं देख रहा हूं वह कस्टम DataMapper एडाप्टर बनाना है।

    धन्यवाद।

    अद्यतन:
    ध्यान दें कि मैं ActiveResource उपयोग नहीं कर सकते क्योंकि यह एक निश्चित तरीके से प्रतिक्रिया करने के लिए है, जो इसे इस उदाहरण में नहीं है JSON सेवा की आवश्यकता है।

  • उत्तर

    3

    संक्षिप्त उत्तर: यह आपकी JSON सेवा पर निर्भर करता है।

    सेवा शुरू करने वालों के लिए रीस्टफुल है? यदि हां, तो आप भाग्य में हैं। ActiveResource dead है, इसलिए मैं इसका उपयोग करने की सलाह नहीं दूंगा, लेकिन कोड स्वयं आपके एपीआई तक पहुंचने के लिए create और find जैसे रैपर विधियों का एक सेट बनाने के लिए एक अच्छा प्रारंभिक बिंदु प्रदान करेगा और रिकॉर्ड्स को रिकॉर्ड करेगा जिस तरह से ActiveRecord बनाता है और रिकॉर्ड रिकॉर्ड करता है डीबी। यह अपेक्षाकृत आसान है यदि आपका एपीआई रीस्टफुल है क्योंकि rails is built around RESTful-ness, इसलिए दोनों के बीच मैपिंग अधिक क्लीनर बन जाती है।

    This article यह सार अच्छी तरह से:

    रेल यह बहुत आसान वेब सेवाओं है कि बाकी सिद्धांतों का पालन करें और वेब ब्राउज़र और प्रोग्राम वेब के साथ समान रूप से अच्छी तरह से काम के निर्माण के लिए बनाता है। असल में, बहुत सी सादगी इन सिद्धांतों का पालन करने से सीधे आती है। हमें अपने क्लाइंट को संसाधन बनाने, पढ़ने, अपडेट करने या हटाने का तरीका नहीं बताया गया था, जो सभी उचित HTTP विधियों का उपयोग करने के बाद थे। हमें बस इतना करना था कि हमारे ग्राहक को सही जगह पर इंगित करें।

    आपकी सेवा है यदि नहीं शोकहारा, जो अन्य प्रश्न पर टिप्पणी से मुझे लगता है कि पहचानने शायद मामला है, तो आप अपने काम आप के लिए बाहर काट होगा। ActiveModel आपके लिए यह काम नहीं करेगा: createActiveRecord::Persistence में परिभाषित किया गया है, और findActiveRecord::FinderMethods में परिभाषित किया गया है। वे ActiveModel में नहीं हैं।ActiveResource उन्हें काफी आसानी से पुन: उत्पन्न करने में सक्षम है क्योंकि यह उस प्रकार की सेवा के बारे में धारणा करता है जो यह इंटरफेसिंग कर रहा है (यानी कि यह रीस्टफुल है, साथ ही कुछ अन्य चीजें)। , इसके सत्यापन प्रणाली, क्रमबद्धता तरीकों, विशेषता परिवर्तन का गंदा ट्रैकिंग, कॉलबैक (before_save, after_save, आदि), अनुवाद/स्थानीयकरण:

    क्या ActiveModel प्रदान करता है अन्य सभी सामान है कि रेल तो मॉडल से निपटने के लिए उपयोगी बनाता है और इसी तरह। ये सभी उपयोगी काम हैं, लेकिन वे अभी भी आपको अपनी एपीआई कॉल लपेटने की समस्या से छोड़ देते हैं।

    1. पहले, अपने एपीआई पर विशेष ध्यान दें और यह पता लगाने के कितने पास यह किया जा रहा है:

      तो यहाँ मैं, क्या सिफारिश करेंगे पर अपने सीमित अनुभव यद्यपि (इस बारे में मेरी अंतिम टिप्पणी देखें) आधारित है RESTful। यदि यह रीस्टफुल है, तो आपको इसके बारे में सोचना होगा कि इसके आसपास कैसे काम करना है ताकि आप इसे एक विश्वसनीय सेवा की तरह व्यवहार कर सकें। ऐसा करने के तरीके के बारे में एक अच्छा संदर्भ ओ रेली RESTful Web Services (विशेष रूप से अध्याय 2, "लेखन वेब सेवा ग्राहक"।) है

    2. यह है कि लागू करता create, find और जो कुछ अन्य ActiveRecord जैसी कार्यप्रणाली के चारों ओर एक एपीआई आवरण के लिए आप चाहते हैं बनाएं की है। आप वास्तव में नेट :: HTTP के साथ काम करने के बजाय एपीआई को अनुरोध करने के लिए Faraday या HTTParty जैसे मणि का उपयोग करना चाहेंगे। (मैंने कभी भी डेटामैपर का उपयोग नहीं किया है, इसलिए उस पर टिप्पणी नहीं कर सकते हैं।)
    3. एक्टिवमोडेल के जो भी तत्व आप अपने रैपर वर्ग को रेल मॉडल की तरह बनाने के लिए उपयोग करना चाहते हैं: सत्यापन, क्रमबद्धता आदि रेल 4 में, आप कर सकते हैं वास्तव में नई barebones ActiveModel::Model का उपयोग कर सबकुछ शामिल करें।

    इससे आपको रेलवे मॉडल के रूप में अपनी JSON सेवा का उपयोग करने का अधिक तरीका मिलेगा।

    रिकॉर्ड के लिए, वास्तव में इस तरह की चीज को लागू करने में मेरा अनुभव एक एपीआई एपीआई तक पहुंचने के लिए एक एपीआई रैपर (कार्यों में) बनाने के लिए सीमित है। रैपर में एक कक्षा है जिसमें एपीआई को प्रश्नों को सत्यापित करने के लिए ActiveModel validators शामिल हैं। मुझे ActiveModel validators वास्तव में यह गारंटी देने के लिए उपयोगी पाया गया है कि API को सही तरीके से एक्सेस किया गया है, लेकिन रैपर केवल एपीआई से रिकॉर्ड्स प्राप्त करने के लिए है, न कि वास्तव में उन्हें बनाने या अपडेट करने के लिए, इसलिए इंटरफ़ेस जो अपेक्षा करता है उससे काफी आसान है आप इमारत करेंगे

    +0

    इस तरह के एक व्यापक उत्तर के लिए धन्यवाद। सौभाग्य से, जेएसओएन सेवा रीस्टफुल है, यह सिर्फ यह है कि यह ActiveResource द्वारा अपेक्षित तरीके से प्रतिक्रिया नहीं देता है। मैं अब सक्रिय संसाधन से बचूंगा कि मुझे पता है कि यह मर चुका है, और इसके बजाय आपने जो डीज़ोन आलेख लिखा है उसे पढ़ा जाएगा। एक बार फिर धन्यवाद! – gjb

    +0

    ओह यह अच्छी खबर है!उस मामले में, कार्य बहुत मुश्किल नहीं होना चाहिए। भले ही आप ActiveResource का उपयोग नहीं कर रहे हैं, आप यह देखने के लिए कोड को देख सकते हैं कि यह कैसे काम करता है। –

    +0

    यदि आप अभी भी इस पर काम कर रहे हैं, तो कुछ अन्य रत्न जो उपयोगी हो सकते हैं: https://github.com/filtersquad/api_smith https://github.com/remiprev/her https://github.com/ apotonick/roar –

    0

    मैं इसे अपने मणि "otrs_connector" में बस करता हूं ... यह आपकी सेवा के लिए काम नहीं करेगा लेकिन यह आपको यह कैसे करने के बारे में एक विचार दे सकता है ... मैंने जो दृष्टिकोण लिया वह सबसे अच्छा नहीं हो सकता है और थोड़ा सा refactored की जरूरत है, लेकिन यह काम करता है, और उस पर बहुत अच्छी तरह से।

    +0

    धन्यवाद के अपने उदाहरण है, मैं इस पर एक नज़र होगा। – gjb

    1

    मुझे लगता है कि आप ActiveResource है जो खोज रहे हैं, तो आप इसे ActiveRecord के बजाय एक RESTful JSON एपीआई के साथ काम करने this link और this (apidock)

    +0

    धन्यवाद। दुर्भाग्यवश ऐसा लगता है कि जेएसओएन एपीआई एक निश्चित तरीके से प्रतिक्रिया देता है, जिसे मैं साथ काम कर रहा हूं, वह नहीं है। उदाहरण के लिए, नए रिकॉर्ड के JSON प्रतिनिधित्व के बजाए, यदि नया रिकॉर्ड बनाया गया है तो यह 'ओके' के साथ प्रतिक्रिया देता है। – gjb

    1

    देखने के लिए सबसे अच्छा तरीका यह करने के लिए इस्तेमाल एक ActiveModel लागू करने के लिए कर सकते हैं। यह railscast मूल बातें शामिल करता है।

    +0

    धन्यवाद, मैं इसे देख लूंगा। DataMapper पर ActiveModel का क्या फायदा है? – gjb

    +0

    एक्टिवमोडेल रेल के साथ शामिल है, इसलिए आपको बॉक्स के बाहर इसके लिए बेहतर समर्थन मिलता है। –

    0

    यदि webservice चीजों को करने के सामान्य "रेल मार्ग" से बाहर है, तो मैं HTTParty की अनुशंसा करता हूं। Proxy को webservice पर बनाना बहुत आसान है जो प्रतिक्रिया देता है हालांकि आप इसे चाहते हैं।

    उदाहरण के लिए, यहाँ तक पहुँचने ट्विटर समय

    class Twitter 
        include HTTParty 
        base_uri 'twitter.com' 
    
        def initialize(u, p) 
        @auth = {:username => u, :password => p} 
        end 
    
        # which can be :friends, :user or :public 
        # options[:query] can be things like since, since_id, count, etc. 
        def timeline(which=:friends, options={}) 
        options.merge!({:basic_auth => @auth}) 
        self.class.get("/statuses/#{which}_timeline.json", options) 
        end 
    
        def post(text) 
        options = { :query => {:status => text}, :basic_auth => @auth } 
        self.class.post('/statuses/update.json', options) 
        end 
    end 
    
    twitter = Twitter.new(config['email'], config['password']) 
    pp twitter.timeline 
    
    +0

    धन्यवाद, यह एक दिलचस्प विकल्प है, लेकिन मैं जेएसओएन सेवा को पारंपरिक रेल मॉडल की तरह काम करने के लिए पसंद करूंगा। – gjb

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