Token $kaynak auth istekleri göndermek için Nasıl?AngularJS:
Benim API kaynak isterken bir auth token göndermek istiyorum.
Kaynak bir hizmet kullanarak $uygulanması yaptım:
factory('Todo', ['$resource', function($resource) {
return $resource('http://localhost:port/todos.json', {port:":3001"} , {
query: {method: 'GET', isArray: true}
});
}])
Ve auth token saklayan bir hizmeti var:
factory('TokenHandler', function() {
var tokenHandler = {};
var token = "none";
tokenHandler.set = function( newToken ) {
token = newToken;
};
tokenHandler.get = function() {
return token;
};
return tokenHandler;
});
tokenHandler.get
belirteç göndermek için her talebi Todo
servis üzerinden göndermek istiyorum. Belirli bir eylem çağrısı içine koyarak göndermeyi başardı. Örneğin bu gibi çalışır:
Todo.query( {access_token : tokenHandler.get()} );
Ama her çağrı ile yollanmalı Todo
servis parametre olarak access_token tanımlamak için tercih ederdim. Ve KURU geliştirmek için.
Ama fabrikada her şey access_token fabrika tanımlamadan önce mevcut olması gerekir bu yüzden sadece bir kez idam, ve cant sonra değiştirin.
Bir şekilde dinamik olarak güncelleştirilen bir istek parametresi servis koymak için var mı?
CEVAP
Andy Joslin için teşekkürler. Kaynak eylemleri sarma fikrini aldım. Kaynak için servis bu gibi görünüyor:
.factory('Todo', ['$resource', 'TokenHandler', function($resource, tokenHandler) {
var resource = $resource('http://localhost:port/todos/:id', {
port:":3001",
id:'@id'
}, {
update: {method: 'PUT'}
});
resource = tokenHandler.wrapActions( resource, ["query", "update"] );
return resource;
}])
Gördüğünüz gibi kaynak en başta her zamanki gibi tanımlanır. Benim örnekte bu özel bir eylem update
denilen içerir. Daha sonra kaynak ve parametreleri gibi eylemler, bir dizi alır tokenHandler.wrapAction()
yöntemin dönüş yazılır.
Beklediğiniz gibi ikinci yöntemi aslında eylemleri auth her isteği belirteci vardır sarar ve değiştirilmiş bir kaynak verir. Bunun için: kod bir göz atalım
.factory('TokenHandler', function() {
var tokenHandler = {};
var token = "none";
tokenHandler.set = function( newToken ) {
token = newToken;
};
tokenHandler.get = function() {
return token;
};
// wrap given actions of a resource to send auth token with every
// request
tokenHandler.wrapActions = function( resource, actions ) {
// copy original resource
var wrappedResource = resource;
for (var i=0; i < actions.length; i ) {
tokenWrapper( wrappedResource, actions[i] );
};
// return modified copy of resource
return wrappedResource;
};
// wraps resource action to send request with auth token
var tokenWrapper = function( resource, action ) {
// copy original action
resource['_' action] = resource[action];
// create new action wrapping the original and sending token
resource[action] = function( data, success, error){
return resource['_' action](
angular.extend({}, data || {}, {access_token: tokenHandler.get()}),
success,
error
);
};
};
return tokenHandler;
});
Gördüğünüz gibi wrapActions()
metot parametreleri kaynak bir kopyasını oluşturur ve başka bir fonksiyonu tokenWrapper()
arama actions
dizi aracılığıyla döngüler her eylem için. Sonunda kaynağın değiştirilmiş kopyasını döndürür.
Tüm tokenWrapper
yöntem ilk kaynak harekete hazır bir kopyasını oluşturur. Bu kopyalama sonunda alt çizgi vardır. query()
_query()
olur. Daha sonra yeni bir yöntem query()
orijinal yöntem üzerine yazar. Bu yeni yöntem auth her istek, bu eylem ile göndermek ile token sağlamak Andy Joslin tarafından önerilen _query()
, sarar.
Bu yaklaşım ile iyi bir şey, biz hala her angularjs kaynak (alın, sorgu, Kaydet, vb.) ile gelen, önceden tanımlanmış eylemleri kullanabilirsiniz. onları yeniden tanımlamak zorunda kalmadan. Ve kodun geri kalan (örneğin denetleyicileri içinde) varsayılan eylem adını kullanabiliriz.
Nasıl FormData nesneleri göndermek içi...
Nasıl AngularJS $http urlencoded form ...
Nasıl AngularJS içinde geçersiz $kayna...
&Quot;çok parçalı/-veri formu gönderme...
Nasıl terminalden Curl ile JSON veri g...