SORU
24 HAZİRAN 2012, Pazar


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
24 HAZİRAN 2012, Pazar


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 tokenWrapperyö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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • engineerguy

    engineerguy

    10 Ocak 2010
  • HowtoDrawAndPaint

    HowtoDrawAnd

    24 EKİM 2010
  • LinusTechTips

    LinusTechTip

    25 Kasım 2008