2012-11-01 17 views
245

मैं नव AngularJS के संपर्क में रहा हूँ, तो मेरी अज्ञानता को माफ करें।

मैं कुछ वेब सेवाओं है कि मैं फोन करना चाहते हैं। $resource या $http, मुझे किस का उपयोग करना चाहिए?

$resource: https://docs.angularjs.org/api/ngResource/service/$resource

$http: https://docs.angularjs.org/api/ng/service/$http

बाद मैं API पृष्ठ उपरोक्त दो मैं खो गया हूँ पढ़ें।

आप सादे अंग्रेजी में मुझे समझा कृपया सकते हैं अंतर है और क्या स्थिति मैं उन्हें इस्तेमाल करना चाहिए में क्या? मैं इन कॉलों को कैसे ढूढ़ूं और परिणामों को जेएस ऑब्जेक्ट्स में सही तरीके से पढ़ूं?

+25

$ संसाधन $ http के शीर्ष पर बनाया गया है, और अंतर्निहित संचार से आगे अमूर्तता प्रदान करता है। इसके लिए एक आरईएसटी एंड-पॉइंट भी आवश्यक है जो $ संसाधन पैटर्न के अनुरूप है। चूंकि आप पूछ रहे हैं, मेरा सुझाव है कि $ http से शुरू करें, परिचित हो जाएं, और फिर बाद में देखें कि क्या आप $ संसाधन में स्थानांतरित कर सकते हैं। –

+4

उत्तर के लिए धन्यवाद। तो, किस स्थिति में $ http ने $ संसाधन से अधिक पसंद किया है, इसके अलावा मैं एपीआई से परिचित हो सकता हूं? – Tom

उत्तर

159

$http सामान्य प्रयोजन AJAX के लिए है। ज्यादातर मामलों में आप इसका उपयोग करेंगे। $http के साथ आप मैन्युअल GET, POST, DELETE प्रकार कॉल करने और वस्तुओं वे अपने दम पर वापसी प्रसंस्करण करने जा रहे हैं।

$resource RESTful वेब एपीआई स्थितियों में इस्तेमाल के लिए $http गिर्द घूमती है।


बहुत आम तौर पर बात हो रही है: एक आरामदायक वेब सेवा GET तरह HTTP विधियों, POST, PUT, DELETE, आदि के आधार पर है कि डेटा प्रकार के साथ अलग अलग बातें करता है एक डेटा प्रकार के लिए एक अंत बिंदु के साथ एक सेवा होगी तो एक $resource के साथ, आप भी एक जावास्क्रिप्ट वस्तु के रूप में संसाधन प्राप्त करने के लिए एक GET कॉल कर सकते हैं, तो यह परिवर्तन और वापस भेज एक POST साथ, या DELETE साथ इसे हटा दें।

... कि अगर समझ में आता है।

+0

तो $ संसाधन संसाधनों को संभालता है, इसका मतलब है कि इसका उपयोग सामान्य वेब सेवाओं को कॉल करने के लिए भी किया जा सकता है? चूंकि यह पोस्ट हटा देता है सब कुछ हटा दें। तो, किस स्थिति में $ http ने $ संसाधन से अधिक पसंद किया है? – Tom

+7

वास्तव में जब भी आप वास्तव में आराम से अंतराल से निपट नहीं रहे हैं। यह बहुत सारी कार्यक्षमता जोड़ता है जिसकी आपको आवश्यकता नहीं होगी यदि आपका एंडपॉइंट केवल जीईटी की अनुमति देता है, उदाहरण के लिए। –

+0

@ ब्लेश, इसलिए '$ संसाधन' सेवा का उपयोग केवल तभी निष्क्रिय होगा यदि आपका आरईएसटी एंडपॉइंट 'GET',' POST', * और * DELETE' का समर्थन करता है? दस्तावेज़ (http://docs.angularjs.org/api/ngResource.$resource) दिखाते हैं कि आपको '3 संसाधन 'के साथ इन 3 REST विधियां मिलती हैं। –

7

जब $http या $resource के बीच चयन करने की बात आती है तो तकनीकी रूप से बोलते हुए सार में कोई सही या गलत उत्तर नहीं होता है, दोनों ही वही करेंगे।

$resource का उद्देश्य आपको पैरामीटर मानों के साथ टेम्पलेट स्ट्रिंग (प्लेसधारकों वाली एक स्ट्रिंग) में पास करने की अनुमति देना है। $resource टेम्पलेट स्ट्रिंग से प्लेसहोल्डर को ऑब्जेक्ट के रूप में पारित पैरामीटर मानों के साथ प्रतिस्थापित करेगा। आरईएसटीफुल डेटासोर्स के साथ बातचीत करते समय यह अधिक उपयोगी होता है क्योंकि वे यूआरएल को परिभाषित करने के लिए समान सिद्धांतों का उपयोग करते हैं।

क्या $http करता अतुल्यकालिक HTTP अनुरोध प्रदर्शन करने के लिए है।

+1

यह एक अच्छा जवाब है क्योंकि यह इंगित करता है कि $ http संसाधनों से अनुरोधों को शक्ति देता है, और यह अनिवार्य रूप से वही काम करता है। – coblr

+0

@ डलोरोजो तो आप कहने का मतलब है कि '$ संसाधन' असीमित रूप से प्रदर्शन नहीं कर सकता है? बस – Satyadev

+0

को स्पष्ट करना चाहता था, नहीं, मैंने जो बताया है वह है कि '$ http' एक असीमित HTTP अनुरोध करने का सबसे आसान तरीका है और' संसाधन 'अनिवार्य रूप से वही करता है लेकिन विभिन्न पैरामीटर – Dalorzo

200

मुझे लगता है कि अन्य उत्तरों, सही होने पर, प्रश्न की जड़ को स्पष्ट रूप से समझाएं: RESTHTTP का सबसेट है। यह सब कुछ REST के माध्यम से किया जा सकता है कि HTTP के माध्यम से किया जा सकता है लेकिन नहीं सब कुछ HTTP के माध्यम से किया जा सकता है कि REST के माध्यम से किया जा सकता है का मतलब है। यही कारण है कि $resource आंतरिक रूप से $http का उपयोग करता है।

तो, जब एक दूसरे को उपयोग करने के लिए?

तो आप सभी की जरूरत है REST, वह है, यदि आप एक RESTful वेब सेवा का उपयोग करने की, $resource यह सुपर आसान है कि वेब सेवा के साथ बातचीत करने के लिए जा रहा है कोशिश कर रहे हैं।

यदि इसके बजाय, आप RESTful webservice नहीं है, तो आपको $http के साथ जाना होगा। ध्यान रखें, आप $http के माध्यम से RESTful webservice तक पहुंच सकते हैं, यह $resource के मुकाबले कहीं अधिक बोझिल होगा। jQuery.ajax (कोणीय के $http के समतुल्य) का उपयोग करके अधिकांश लोग AngularJS के बाहर ऐसा कर रहे हैं।

+21

अच्छा उत्तर के साथ, यह होना चाहिए स्वीकार किया जाना चाहिए, शीर्ष पर नहीं – Hoto

+2

इसका मतलब है कि हमारे पास रीस्टफुल कॉल करने के तीन तरीके हैं ?? $ संसाधन का उपयोग, $ http और jquery.ajax, क्या मैं सही हूँ ?? –

+4

@ जेकहुआंग आप इसे किसी पुस्तकालय के बिना भी कॉल कर सकते हैं, ऐसा करने के अनंत तरीके हैं। मैंने अंगुलरजेएस दुनिया में 2 सबसे लोकप्रिय दृष्टिकोण और इसके बाहर सबसे आम दृष्टिकोण का खुलासा किया। – bluehallu

22

मुझे लगता है कि उस संसाधन पर जोर देना महत्वपूर्ण है कि सर्वर से प्रतिक्रिया के रूप में ऑब्जेक्ट या सरणी को कच्ची स्ट्रिंग नहीं है। तो यदि आपके पास प्रतिक्रिया के रूप में कच्ची स्ट्रिंग (या वस्तु और सरणी को छोड़कर कुछ भी) है, तो आपको $ http

+0

क्या इसका मतलब है कि $ http ऑब्जेक्ट और सरणी का समर्थन नहीं करता है? बस स्पष्ट करना चाहता था। – Shardul

+0

मेरा मानना ​​है कि $ http ऑब्जेक्ट्स, सरणी और तारों का समर्थन करता है - मुझे उस पर पुष्टि की आवश्यकता होगी हालांकि – Katana24

+0

@ शारदुल, मुझे समझ में आया कि $ http किसी भी तरह की प्रतिक्रिया के साथ सौदों पर है लेकिन $ संसाधन केवल ऑब्जेक्ट्स और सरणी के साथ सौदा करता है। –

2

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

जहाँ तक मुझे यह देखने के रूप में, संसाधन सेवा सिर्फ एक शॉर्टकट, आप http सेवा के साथ कुछ भी कर सकते है न लिखें।

+0

मुझे यकीन नहीं है कि मैं शॉर्टकट के रूप में $ संसाधन वर्गीकृत करूंगा। यह $ http के लिए एक रैपर है, इसलिए $ http का उपयोग सीधे "छोटा" होगा। यह आपके लिए $ http को कॉन्फ़िगर करने का एक तरीका है ताकि $ http का उपयोग करते समय आपके पास संभावित रूप से कम कोड हो। एक मामले में '$ http.get ('/ path/to/thing', params) 'बनाम myResource.get (पैरा)' और वास्तव में' myResource' के लिए कॉन्फ़िगरेशन कर रहा है। अधिक कोड ऊपर और केवल वास्तव में _the same_ API संज्ञा के साथ तैराकी से काम करता है। अन्यथा, आप उतना ही कोडिंग कर रहे हैं जितना कि आपने $ http का उपयोग किया था। – coblr

2

एक बात मैं देखा जब $ संसाधन $ http से अधिक है यदि आप वेब एपीआई .net में उपयोग कर रहे हैं

$ संसाधन एक नियंत्रक है कि एक ही उद्देश्य अमल में बंधा हुआ है का उपयोग कर।

$ संसाधन ('/ उपयोगकर्ता /: उपयोगकर्ता आईडी', {userId: '@ id'});

[HttpGet] 
public bool Get(int id) 
{ 
    return "value" 
} 

public void Post([FromBody]string value) 
{ 
} 

public void Put(int id, [FromBody]string value) 
{ 
} 

public void Delete(int id) 
{ 
} 

जबकि $ http कुछ भी हो सकता है। बस यूआरएल निर्दिष्ट करें।

$ http.get - "API/प्रमाणित"

[HttpGet] 
public bool Authenticate(string email, string password) 
{ 
    return _authenticationService.LogIn(email, password, false); 
} 

यह सिर्फ मेरी राय है।

38

$http जिसमें सामान्य मतलब है कि यह RESTful एपीआई प्लस गैर RESTful एपीआई शामिल कर सकते हैं सामान्य प्रयोजन AJAX कॉल बनाता है।

और $resource उस RESTful भाग के लिए विशिष्ट है।

हाल ही के वर्षों में आराम से एपी प्रचलित आया क्योंकि प्रोग्रामर द्वारा बनाए गए यादृच्छिक यूआरएल के बजाय यूआरएल बेहतर संगठित है।

यदि मैं url बनाने के लिए RESTful API का उपयोग करता हूं, तो यह /api/cars/:carId जैसा कुछ होगा।

$resource जिस तरह से डेटा

angular.module('myApp', ['ngResource']) 

    // Service 
    .factory('FooService', ['$resource', function($resource) { 
     return $resource('/api/cars/:carId') 
    }]); 

    // Controller 
    .controller('MainController', ['FooService', function(FooService){ 
     var self = this; 
     self.cars = FooService.query(); 
     self.myCar = FooService.get('123'); 

    }]); 

यह आपको एक resource object, जो get, save, query, remove, delete तरीकों के साथ स्वचालित रूप से साथ है दे देंगे लाने के लिए।

$http जिस तरह से डेटा

angular.module('myApp', []) 

    // Service 
    .factory('FooService', ['$http', function($http){ 
     return { 
      query: function(){ 
       return $http.get('/api/cars'); 
      }, 

      get: function(){ 
       return $http.get('/api/cars/123'); 
      } 
      // etc... 
     } 

लाने के लिए देखें कि किस प्रकार हम शोकहारा एपीआई पर प्रत्येक आम आपरेशन को परिभाषित करने की जरूरत है। इसके अलावा एक अंतर यह है कि $http रिटर्न promise जबकि $resource रिटर्न एक वस्तु। वहाँ भी तरह restangular


शोकहारा एपीआई साथ कोणीय सौदा मदद करने के लिए एपीआई /api/getcarsinfo की तरह कुछ है, तो प्लग-इन कर रहे हैं। हमारे लिए छोड़ा गया सभी $http का उपयोग करना है।

+4

यह answser होना चाहिए। –

+1

यदि एपीआई '/ api/getcarsinfo' है तो मुझे लगता है कि हम अभी भी' $ संसाधन' – Satyadev

+0

बहुत बढ़िया ....... –

0

$ संसाधन सेवा वर्तमान में वादों का समर्थन नहीं करता है और इसलिए $ http सेवा करने के लिए एक अलग इंटरफ़ेस है।

+1

जाने के लिए आप अच्छे हैं $ संसाधन सेवा वादे का समर्थन करती है, लेकिन यह सीधे $ http की तरह $ $ वादा नहीं करती है। आपको इसे 'var myResource = $ संसाधन (... config ...) की तरह करना है;' फिर सेवा में कहीं और 'मेराResource.get (.. params ...) वापस करें या आप ' var save = myResource.save(); बचाने के $ promise.then (... fn ...)। वापसी की बचत; ' – coblr

25

मुझे लगता है कि उत्तर पर पर निर्भर करता है जब आप कोड लिख रहे हैं। उपयोग $http अगर आप, कोणीय के लिए नए हैं, जब तक आप जानते हैं कि तुम क्यों $resource की जरूरत है। जब तक आपके पास $http का ठोस अनुभव नहीं है, तो आप $resourceमें अपने कोड में $http के साथ चिपकने के प्रभावों को समझते हैं।

यह मेरा अनुभव था: मैं अपनी पहली कोणीय परियोजना शुरू की, मैं एक RESTful इंटरफ़ेस के लिए HTTP अनुरोध बनाने के लिए आवश्यक है, तो मैं एक ही अनुसंधान आपके वर्तमान कार्य किया था। चर्चा के आधार पर मैंने इस तरह के प्रश्नों में पढ़ा, मैंने $resource के साथ जाना चुना। यह एक गलती थी जो मैं चाहता था कि मैं पूर्ववत कर सकूं। तुम सिर्फ क्या जरूरत

  1. $http उदाहरण, भरपूर मात्रा में सहायक होते हैं, और आम तौर पर: यहां इसका कारण बताया। साफ़ $resource उदाहरण दुर्लभ हैं, और (मेरे अनुभव में) शायद ही कभी आपको चाहिए। कोणीय नौसिखिया के लिए, आप बाद में जब तक अपनी पसंद के निहितार्थ का एहसास नहीं होगा जब आप प्रलेखन के ऊपर अटक puzzling और गुस्से में है कि आप उपयोगी $resource उदाहरण आप मदद करने के लिए नहीं मिल रहा है कर रहे हैं।
  2. $http शायद आप जो खोज रहे हैं उसके लिए 1-से-1 मानसिक मानचित्र है। $http के साथ आपको क्या मिलता है यह समझने के लिए आपको एक नई अवधारणा सीखनी नहीं है। $resource बहुत सारी व्याख्या के साथ लाता है कि आपके पास अभी तक कोई मानसिक मानचित्र नहीं है।
  3. ओह, मैं कहता हूँ कि आप एक नई अवधारणा को जानने के लिए नहीं है? एक कोणीय नौसिखिया के रूप में आप को वादे के बारे में जानना है। $http एक वादा देता है और .then सक्षम है, इसलिए यह कोणीय और वादे के बारे में सीखने वाली नई चीजों के साथ सही है। $resource, जो सीधे वादा नहीं करता है, कोणीय मूलभूत सिद्धांतों पर आपके टिकाऊ समझ को जटिल बनाता है।
  4. $resource शक्तिशाली है क्योंकि यह रीस्टफुल सीआरयूडी कॉल के लिए कोड और इनपुट और आउटपुट के लिए रूपांतरणों को नियंत्रित करता है। यह बहुत अच्छा है अगर आप $http के परिणामों को संसाधित करने के लिए बार-बार कोड लिखने में बीमार हैं। किसी और के लिए, $resource सिंटैक्स की एक गुप्त परत जोड़ता है और पैरामीटर गुजर रहा है जो भ्रमित है।

मेरी इच्छा है कि मैं 3 महीने पहले मुझे जानता था, और मैं अपने आप को जोर से बता रहा हूं: "$http बच्चे के साथ चिपकाएं। यह ठीक है।"

+1

मुझे आपका जवाब पसंद है, खासकर आखिरी पंक्ति। मैं वर्तमान में $ संसाधन बनाम $ http का उपयोग करने में एक बदलाव के माध्यम से जा रहा हूँ। एक चीज जो मैं जोड़ता हूं वह यह है कि $ संसाधन वास्तव में केवल वास्तव में आसान होता है और वास्तव में मदद करता है जब आप उसी एपीआई _noun_ का उपयोग कर रहे हैं, जैसे '/ user /: userId' या'/thing'। एक बार जब आप '/ users/भूमिकाएं/roleId' पर जाते हैं तो आपको प्रति _verb_ आधार पर $ संसाधन यूआरएल और पैराम्स को संशोधित करना होगा और आप उस बिंदु पर $ http का उपयोग भी कर सकते हैं। – coblr

+3

मुझे अपने स्वयं के उत्तर पर टिप्पणी करने के लिए स्किज़ोफ्रेनिक कॉल करें, लेकिन मैंने सोचा कि मैं हालिया अनुभव का उल्लेख करूंगा। मैं '$ संसाधन' को खत्म करने और स्थानों में '$ http' पर स्विच करने के लिए पुन: प्रयास कर रहा हूं। मैं पर्याप्त जोर नहीं दे सकता कि मैं कितना चाहता हूं * मैं कभी भी '$ संसाधन 'नहीं मिला था। मैंने महीनों में '$ संसाधन 'की बारीकियों का पीछा करते हुए शायद एक हफ्ते से ज्यादा बर्बाद कर दिया है। '$ http' इतना आसान और सीधा है, '$ संसाधन' में होने वाले किसी भी लाभ को सीखने की अवस्था से पूरी तरह से मिटा दिया गया था। –