Açısal JS $ http ve $ kaynak


257

Aramak istediğim bazı web servislerim var. $resourceveya $httphangisini kullanmalıyım?

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

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

Yukarıdaki iki API sayfasını okuduktan sonra kayboldum.

Bana açık İngilizce olarak farkın ne olduğunu ve hangi durumda onları kullanmalıyım? Bu aramaları nasıl yapılandırabilir ve sonuçları doğru bir şekilde js nesnelerine okuyabilirim?


25
$ kaynak, $ http üzerine kurulur ve temeldeki iletişimden daha fazla soyutlama sağlar. Ayrıca, $ kaynak örüntülerine uyan bir REST bitiş noktası gerektirir. Sorduğunuzdan, önerim $ http ile başlamak, tanışmak ve daha sonra $ kaynağa geçip geçemeyeceğinizi görmek.
David Riccitelli

4
Cevap için teşekkürler. Peki, hangi durumda $ $ hiç kaynak api tanımak dışında $ kaynak üzerinde tercih edilir?
Tom

Yanıtlar:


168

$httpgenel amaçlı AJAX içindir. Çoğu durumda kullanacağınız şey budur. İle $httpsen yapma gibi gidiyoruz GET, POST, DELETEtip manuel çağırır ve işleme onlar kendi başınıza dönmek nesneleri.

$resource$httpRESTful web API senaryolarında kullanılmak üzere sarar .


ÇOK genellikle Konuşma: Bir dinlendirici web hizmeti yöntemleri gibi HTTP dayalı veri türüyle farklı şeyler yapan bir veri türü için bir son nokta olan bir hizmet olacak GET, POST, PUT, DELETE, vb Yani bir ile $resource, bir çağırabilir GETkaynak elde etmek bir JavaScript nesnesi olarak değiştirin ve ardından a ile geri gönderin POSTve hatta ile silin DELETE.

... Mantıklı geliyorsa.


1
Yani $ kaynak Huzurlu hizmetleri işler, yani normal web servislerini aramak için de kullanılabilir? Çünkü POST DELETE GET tüm bunları koy. Peki, hangi durumda $ http $ $ kaynağından daha çok tercih edilir?
Tom

7
Gerçekten her zaman gerçekten dinlendirici bir son nokta ile uğraşmıyoruz. Örneğin, uç noktanız yalnızca GET'e izin veriyorsa, ihtiyacınız olmayacak birçok işlevsellik ekler.
Ben Lesh

@blesh kullanarak bu yüzden $resourcesadece deyimsel / iyi eğer DİNLENME uç nokta destekleri olacağını hizmeti GET, POST, ve DELETE ? Dokümanlar ( docs.angularjs.org/api/ngResource.$resource ), bu 3 REST yöntemini aldığınızı gösterir $resource.
Kevin Meredith

9
@KevinMeredith: Ya da herhangi bir yöntem. Ekleyebilir PUTveya istediğiniz herhangi bir şey GET, POSTve DELETEsadece varsayılanlardır. Birden fazla HTTP yöntemi için aynı kaynakla (bu önemlidir) ilgilenen bir uç noktanız varsa , $resourceiyi bir seçimdir.
Ben Lesh

RESTful olmayan bir uç nokta için bile, GET ve QUERY tipi veriler için $ source kullanmanın uygun olduğunu gördüm. Yönlendirme ve ciltleme için .$promiseiyi çalışma şekli göz önüne alındığında resolve.
Kevin

210

Diğer cevapların, doğru olsa da, sorunun kökünü tam olarak açıklamadığını hissediyorum: RESTbir alt kümesidir HTTP. Yoluyla yapılabilir Bu araçlar her şey RESTaracılığıyla yapılabilir HTTParacılığıyla yapılabilecek her şeyi ama HTTParacılığıyla yapılabilir REST. Bu yüzden dahili olarak $resourcekullanır $http.

Peki, ne zaman birbirlerini kullanmalı?

Tek ihtiyacınız olan şey REST, yani bir web RESTfulservisine erişmeye çalışıyorsanız ,$resource , bu web servisiyle etkileşimi süper kolaylaştıracaktır.

Bunun yerine, bir web hizmeti olmayan herhangi bir şeye erişmeye çalışıyorsanız RESTful, devam etmeniz gerekecek $http. Unutmayın, RESTfulüzerinden bir web servisine de erişebilirsiniz $http, sadece olduğundan çok daha hantal olacaktır $resource. Çoğu insan bunu AngularJS dışında jQuery.ajax(Angular's eşdeğerini $http) kullanarak yapıyor .


21
güzel cevap, bu kabul edilmelidir, üstte değil
Andrzej Rehmann

2
Bu RESTful aramak için üç yol var demek ?? $ Resource, $ http ve jquery.ajax kullanarak, doğru muyum ??
Jake Huang

4
@JakeHuang Herhangi bir kütüphane olmadan bile diyebilirsiniz, bunu yapmanın sonsuz yolları vardır. AngularJS dünyasındaki en popüler 2 yaklaşımı ve bunun dışındaki en yaygın yaklaşımı gösterdim.
bluehallu

AngularJS'deki en popüler 2 yaklaşımın ne olduğunu bilebilir miyim? : p
Jake Huang

41

$httphangi genel amaçlı AJAX çağrısı yapar genel bunu içerebilir araçlarının RESTful API artı Olmayan dinlendirici api.

ve $resourcebu RESTful kısmı için uzmanlaşmıştır .

Dinlendirici API son yıllarda yaygınlaştı çünkü url, programcılar tarafından oluşturulan rastgele url yerine daha iyi organize edildi.

URL oluşturmak için bir RESTful API kullanırsanız, böyle bir şey olurdu /api/cars/:carId.

$resource veri getirmenin yolu

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');

    }]);

Bu size bir verecek kaynak nesne ile eşlik ediyor, get, save, query, remove, deleteotomatik yöntemlerle.

$http veri getirmenin yolu

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'sinde her ortak işlemi nasıl tanımlamamız gerektiğini görün . Ayrıca bir fark olduğunu $httpdöner promiseiken $resourcegeri dönüş bir amacı. Eğik anlaşma yardımcı olmak üzere üçüncü taraf eklentileri de vardır dinlendirici API gibi restangular


API gibi bir şeyse /api/getcarsinfo. Bizim için geriye kalan tek şey kullanmak $http.


4
Cevap veren bu olmalı.
Royi Namir

1
Eğer api ise /api/getcarsinfosanırım hala kullanabiliriz$resource
kittu

1
Cevap veren bu olmalı. "Ayrıca bir fark, $ resource bir nesneyi döndürürken $ http vaat döndürür" 1- Bu, $ kaynak ile .then kullanmaya gerek yok anlamına mı geliyor? 2- ayrıca bir ön uç kişi olarak ve bu aptalca gelebilir api dinlendirici olup olmadığını nasıl öğrenebilirim? teşekkürler
shireef khatab

1
@shireefkhatab 1. evet, $ kaynak RESTFul API bağlantısı için $ http sadece bir üst düzey soyutlamadır. Doc örneği gösterir nasıl kullanılacağını. 2. tamamen bağlıdır arka uç adam tasarım url. RESTFul api paradigmasına uymak istiyorsa, gitmek için iyi
Qiang

30

Cevabın daha çok kodu yazarken kim olduğunuza bağlı olduğunu düşünüyorum . Angular'da yeniyseniz, neden ihtiyacınız olduğunu öğreninceye kadar kullanın . $http$resourceNasıl somut deneyime sahip olana kadar $httpgeri düzenliyor ve kullanmakta etkilerini anlamaya $resourceiçinde Kodunuzdaki ile, sopa $http.

Bu benim tecrübemdi: İlk Açısal projemi başlattım, RESTful arayüzüne HTTP istekleri yapmam gerekiyordu, bu yüzden şimdi aynı araştırmayı yaptım. Bunun gibi SO sorularında okuduğum tartışmaya dayanarak devam etmeyi seçtim $resource. Keşke geri alabilseydim bir hataydı. İşte nedeni:

  1. $httpörnekler bol, yardımcı ve genellikle ihtiyacınız olan şey. Net $resourceörnekler azdır ve (deneyimlerime göre) nadiren ihtiyacınız olan her şeydir. Açısal yeni başlayanlar için, dokümantasyona kafa karıştırıp sıkışıp kalmanıza $resourceyardımcı olacak yararlı örnekler bulamadığınıza kadar, seçtiğiniz sonuçların farkına varamayacaksınız .
  2. $httpmuhtemelen aradığınız şeyin bire bir zihin haritasıdır. Neyle karşılaştığınızı anlamak için yeni bir konsept öğrenmek zorunda değilsiniz $http.$resourcehenüz zihinsel bir haritanız olmadığı için pek çok nüans getiriyor.
  3. Hata! Yeni bir konsept öğrenmek zorunda olmadığınızı söyledim mi? Bir Eğik acemi olarak size do vaat hakkında öğrenmek zorunda. $httpbir söz .thenveriyor ve başarabiliyor, bu yüzden Angular ve vaatler hakkında öğrendiğiniz yeni şeylere uyuyor. $resourcedoğrudan bir söz vermeyen, açısal temeller üzerindeki belirsiz kavrayışınızı zorlaştırır.
  4. $resourcegüçlüdür çünkü RESTful CRUD çağrılarının kodunu ve giriş ve çıkış dönüşümlerini yoğunlaştırır. $httpKendinizin sonuçlarını işlemek için tekrar tekrar kod yazmaktan bıktıysanız bu harika bir şey. Başka birine $resource, kafa karıştırıcı bir sözdizimi ve parametre geçirme gibi şifreli bir katman ekler.

Keşke beni 3 ay önce tanımış olsaydım ve kendime kesinlikle şunu söylerdim: "Çocuğa sadık kal $http. Sorun değil."


1
Cevabınızı seviyorum, özellikle son satırı. Şu anda $ resource vs $ http kullanarak bir geçiş yaşıyorum. Ayrıca ekleyeceğim bir şey $ kaynak gerçekten sadece gerçekten kullanışlı geliyor ve aslında gibi veya aynı API isim kullanırken yardımcı olur . Bir kez hareket ettikten sonra, $ resource url ve params'i fiil temelinde değiştirmek zorundasınız ve bu noktada $ http kullanıyor olabilirsiniz. /user/:userId/thing/users/roles/:roleId
coblr

3
Kendi cevabım hakkında yorum yapmak için bana şizofreni deyin, ama daha yeni deneyimlerden bahsedeceğim. Elimde olmak $resourceve $httpyerlere geçmek için yeniden düzenleme yapıyorum . Daha önce hiç karşılaşmamış olsaydım dilek dileklerinin ne kadarını dile getireceğimi yeterince vurgulayamıyorum $resource. Muhtemelen bir haftadan fazla bir süreden beri nüansları kovalayarak boşa harcadım $resource. $httpo kadar kolay ve anlaşılır ki, elde edilecek kazanç $resourceöğrenme eğrisi tarafından tamamen ortadan kaldırıldı.
Matthew Marichiba

24

Ben $ kaynak nesne veya dizi ham dize değil sunucudan yanıt olarak beklemek vurgulamak önemli olduğunu düşünüyorum. Yanıt olarak ham dize (veya nesne ve dizi dışında bir şey) varsa, $ http kullanmanız gerekir


Bu, $ http'nin nesne ve diziyi desteklemediği anlamına mı geliyor? Sadece açıklığa kavuşturmak istedim.
Shardul

$ Http, nesneleri, dizileri ve dizeleri desteklediğine inanıyorum
bununla

@Shardul, $ http her türlü yanıtla uğraştığını ancak $ source'un sadece nesneler ve dizilerle uğraştığını anladım.
shireef khatab

Doğru değil, yine de bir String döndürmek için $ resource kullanabilirsiniz. Döndürülen Dizeyi bir nesneye sarmak için ön uç kodunuzda 'transformResponse' kullanın.
Terry Deng

7

Seçim yapmak söz konusu olduğunda $httpveya$resourceTeknik konuşmak , özünde doğru ya da yanlış cevap yoktur, her ikisi de aynı şeyi yapacaktır.

Amacı $resource, parametre değerleriyle birlikte bir şablon dizesi (yer tutucu içeren bir dize) geçirmenize izin vermektir. yer tutucuların$resource yerini alacak parametresi ile şablon dizisinden bir nesne olarak geçirilen bu varlık değer verir. URL'leri tanımlamak için benzer ilkeleri kullandıklarından, bu çoğunlukla RESTFul veri kaynağı ile etkileşimde kullanışlıdır.

Bunun $httpiçin Eşzamansız HTTP İsteklerini gerçekleştirmektir.


1
Bu iyi bir yanıttır, çünkü $ http'nin $ source'dan gelen istekleri güçlendirdiğini ve aslında aynı şeyi yaptığını gösterir.
coblr

@Dalorzo Yani demek istediğim $resourceAsenkronize olamaz? Sadece açıklığa kavuşturmak istedim
kittu

Hayır, işaret ettiğim, sonunda $httpAsenkron HTTP İsteklerini gerçekleştirmenin en basit yolu ve $resourceaslında aynı şeyi farklı parametrelerle yapan şey
Dalorzo

2

kaynak hizmeti sadece REST APSI'lerle çalışmak için yararlı bir hizmettir. kullandığınızda CRUD yöntemlerinizi yazmazsınız (oluşturma, okuma, güncelleme ve silme)

Gördüğüm kadarıyla, kaynak hizmeti sadece bir kısayoldur, http hizmeti ile her şeyi yapabilirsiniz.


$ Resource öğesini kısayol olarak sınıflandıracağımdan emin değilim. $ Http için bir sarıcı, bu yüzden $ http doğrudan kullanmak "daha kısa" olacaktır. $ Http'yi kullanmanın potansiyel olarak daha az koda sahip olması için $ http'yi yapılandırmanın bir yoludur. Bir durumda artı $http.get('/path/to/thing', params)karşı myResource.get(params)aslında yapılandırma yapmak myResource. Daha fazla kod ön ve sadece gerçekten aynı API adıyla yüzerek çalışır . Aksi takdirde, tıpkı $ http kullandığınız kadar kod yazarsınız.
coblr

2

$ Http üzerinde $ kaynak kullanırken fark bir şey .net Web API kullanıyorsanız

$ resource, tek bir amacı yürüten bir denetleyiciye bağlanır.

$ resource ('/ 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 bir şey olabilir iken. sadece URL'yi belirtin.

$ http.get - "api / kimlik doğrulaması"

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

bu sadece benim görüşüm.


0

$ Kaynak hizmeti şu anda vaatleri desteklememektedir ve bu nedenle $ http hizmetiyle belirgin şekilde farklı bir arayüze sahiptir.


1
$ Kaynak hizmeti vaatleri destekliyor, ancak $ http gibi doğrudan bir $ vaadi döndürmüyor. Yaptığınız var myResource = $resource(...config...);hizmette başka bir yerde olduğu gibi yapmalısınız return myResource.get(..params...)ya da yapabilirsinizvar save = myResource.save(); save.$promise.then(...fn...); return save;
coblr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.