AngularJS $ http और $ संसाधन


257

मेरे पास कुछ वेब सेवाएं हैं जिन्हें मैं कॉल करना चाहता हूं। $resourceया $http, मुझे कौन सा उपयोग करना चाहिए?

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

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

जब मैं एपीआई पृष्ठों के ऊपर दो पढ़ता हूं तो मैं खो जाता हूं।

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


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

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

जवाबों:


168

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

$resourcewraps $httpRESTful वेब एपीआई स्थितियों में इस्तेमाल के लिए।


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

... यदि इसका कोई औचित्य हो।


1
इसलिए $ संसाधन, शेष सेवाओं को संभालता है, इसका मतलब है कि इसका उपयोग सामान्य वेब सेवाओं को कॉल करने के लिए भी किया जा सकता है? चूँकि यह वह सब प्राप्त करता है जो पोस्ट डिलीट करता है। तो, $ संसाधन पर $ http को किस स्थिति में पसंद किया जाता है?
टॉम

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

@blesh, का उपयोग कर तो $resourceसेवा केवल मुहावरेदार / अच्छा अगर आपके REST एंडपॉइंट का समर्थन करता है हो सकता है GET, POST, और DELETE ? डॉक्स ( docs.angularjs.org/api/ngResource.$resource ) बताते हैं कि आपको ये 3 REST विधियाँ मिलती हैं $resource
केविन मेरेडिथ

9
@KevinMeredith: या यह विधि की किसी भी संख्या है। आप जोड़ सकते हैं PUTया कुछ और आप चाहते हैं GET, POSTऔर DELETEबस चूक हैं। यदि आपके पास एक समापन बिंदु है जो एक से अधिक HTTP विधि के लिए समान संसाधन (जो महत्वपूर्ण है) से संबंधित है, तो $resourceएक अच्छा विकल्प है।
बेन लैश

यहां तक ​​कि एक भी नहीं-समापन बिंदु के लिए, मैंने GET और QUERY प्रकार के डेटा के लिए $ संसाधन का उपयोग करना सुविधाजनक पाया है। जिस .$promiseतरह resolveसे रूटिंग और बाइंडिंग के लिए अच्छी तरह से काम करता है ।
केविन

210

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

तो, एक दूसरे का उपयोग कब करें?

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

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


21
अच्छा जवाब, यह स्वीकार किया जाना चाहिए, न कि शीर्ष पर
आंद्रेजे रहमान

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

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

क्या मुझे पता है कि AngularJS में 2 सबसे लोकप्रिय दृष्टिकोण क्या हैं? : पी
जेक हुआंग

41

$httpसामान्य उद्देश्य AJAX कॉल करता है, जिसमें सामान्य का अर्थ है इसमें RESTful api plus गैर- Restful api शामिल हो सकते हैं ।

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

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

यदि मैं 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');

    }]);

यह आपको एक दे देंगे संसाधन वस्तु है, जो साथ साथ है 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...
        }

देखें कि हमें RESTFul API पर प्रत्येक सामान्य ऑपरेशन को कैसे परिभाषित करना है । एक अंतर यह भी है कि किसी वस्तु को $httpवापस promiseकरते समय $resourceरिटर्न। रेस्टफुल जैसे RESTFul एपीआई के साथ कोणीय सौदे में मदद करने के लिए तीसरे पक्ष के प्लगइन्स भी हैं


अगर एपीआई कुछ ऐसा है /api/getcarsinfo। हमारे लिए सभी का उपयोग करना है $http


4
यह उत्तर देने वाला होना चाहिए।
रॉयि नामिर

1
यदि एपीआई है तो /api/getcarsinfoमुझे लगता है कि हम अभी भी उपयोग कर सकते हैं$resource
किट्टू

1
यह उत्तर देने वाला होना चाहिए। जब आपने कहा "एक अंतर यह भी है कि $ http रिटर्न का वादा किया जाता है जबकि $ संसाधन एक वस्तु देता है" 1- क्या इसका मतलब है कि मुझे $ संसाधन के साथ उपयोग करने की आवश्यकता है। 2- यह भी एक सामने वाले व्यक्ति के रूप में है और यह मूर्खतापूर्ण लग सकता है कि मैं कैसे पता लगा सकता हूं कि एपी आराम कर रहा है या नहीं? धन्यवाद
shireef khatab

1
@shireefkhatab 1. हाँ, $ संसाधन RESTFul API के लिए $ http का उच्च स्तर का अमूर्त खंड है। डॉक उदाहरण से पता चलता है कि यह कैसे उपयोग करने के लिए। 2. यह पूरी तरह से इस बात पर निर्भर करता है कि आपका बैकेंड लड़का url कैसे डिज़ाइन करता है। यदि वह रैस्टफुल आपी प्रतिमान के अनुरूप होना चाहता है, तो आप जाने के लिए अच्छा है
किआंग

30

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

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

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

काश मैं 3 महीने पहले मुझे जानता था, और मैं जोरदार ढंग से खुद से कह रहा था: "स्टिक विद $httpकिड। इट्स जस्ट फाइन।"


1
मुझे आपका जवाब पसंद है, खासकर आखिरी लाइन। मैं वर्तमान में $ संसाधन बनाम $ http का उपयोग करके एक बदलाव से गुजर रहा हूं। एक बात मैं यह भी जोड़ूंगा कि $ संसाधन वास्तव में केवल वास्तव में काम में आता है और वास्तव में मदद करता है जब आप एक ही एपीआई संज्ञा , जैसे /user/:userIdया का उपयोग कर रहे हैं /thing। एक बार जब आप आगे बढ़ते हैं /users/roles/:roleIdतो आपको प्रति क्रिया के आधार पर $ संसाधन url और params को संशोधित करना होता है और आप उस बिंदु पर $ http का उपयोग कर सकते हैं।
coblr

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

24

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


इसका मतलब यह है कि $ http वस्तु और सरणी का समर्थन नहीं करता है? बस स्पष्ट करना चाहता था।
शार्दुल

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

@ शार्दूल, मैं समझ गया कि $ http किसी भी तरह की प्रतिक्रिया से संबंधित है, लेकिन $ संसाधन वस्तुओं और सरणियों से संबंधित है।
shireef khatab

सच नहीं है, आप अभी भी एक स्ट्रिंग वापस करने के लिए $ संसाधन का उपयोग कर सकते हैं। किसी ऑब्जेक्ट में दिए गए स्ट्रिंग को लपेटने के लिए अपने फ्रंटएंड कोड में 'ट्रांसफॉर्मेशन' का उपयोग करें।
टेरी डेंग

7

यह चयन करने के लिए के बीच आता है $httpया $resourceतकनीकी तौर पर वहाँ सार में कोई सही या गलत जवाब है दोनों भी ऐसा ही होगा।

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

$httpएसिंक्रोनस HTTP अनुरोध करने के लिए क्या करना है।


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

@ डलोरेजो तो आपके कहने का मतलब है कि $resourceअतुल्यकालिक प्रदर्शन नहीं कर सकते? बस स्पष्ट करना चाहता था
किट्टू

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

2

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

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


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

2

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

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

$ संसाधन ('/ user /: userId', {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 - "एपीआई / प्रमाणित"

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

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


0

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


1
$ संसाधन सेवा वादों का समर्थन करती है, लेकिन यह सीधे $ http की तरह एक $ वादे को वापस नहीं करती है। आप इसे करना चाहते हैं var myResource = $resource(...config...);तो कहीं और सेवा में आप return myResource.get(..params...)या आप कर सकते हैंvar save = myResource.save(); save.$promise.then(...fn...); return save;
coblr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.