1.0.2 • Published 6 years ago

ng1-api-service v1.0.2

Weekly downloads
3
License
MIT
Repository
github
Last release
6 years ago

api-service

一个封装了ngResource服务模块的库,用于快速构建可设置本地缓存的reset风格的API服务。

下载: npm install --save ng1-api-service

依赖:

  • angular
  • angular-resource

基本使用教程

1、构建一个请求服务

let  { apiModule, ResourceParams, ApiService } = require('ng1-api-service');

@ResourceParams({
    apiPath: '/app/:id',
})
class Api extends ApiService{}

var app = angular.module('app', [apiModule]).service('Api', Api);

如上所示,构建一个API服务变得相当简单,从‘api-service’包导出apiModuleResourceParamsApiService。新建一个类继承ApiService,然后使用@ResourceParams装饰器为该类注入一些元数据,最后在跟模块中导入apiModule模块,然后使用service方法注入该服务即可。

你可以多次新建类继承ApiService,并使用@ResourceParams装饰器装饰该类来创建不同的请求API。这在一个大型的,需要发送多次请求的系统的会变得尤其高效,然而这个库的功能当然不可能只有这些,更详细的信息请查看高级使用教程。

2、设置请求服务器地址

apiModule模块提供了了一个名为localCacheServiceProvider的提供者,通过它可以在config中设置服务器的地址,服务器地址只需要设置一次,那么每次的请求都会转发到该地址上。

app.config(['localCacheServiceProvider', function(localCacheServiceProvider){
    localCacheServiceProvider.setConfig({
        API_SERVER: 'http://localhost:8888'
    });
}]);

如以上我们在构建请求服务的时候设置了apiPath/app/:id,那么最终的请求就是http://localhost:8888/app/:id

3、使用服务请求数据

该库使用和$resource服务一样的请求风格,如果你对于这种请求方式有任何疑惑的话请参考NgResource

app.controller('myCtrl', ['$scope', 'Api', ($scope, Api) => {
    $scope.create = function() {
        //可以通过promise返回
        Api.create({id: 123}).$promise.then(res => {
            $scope.result = res;
        }).catch(err => {});
    };
    $scope.get = function() {
        //也可以通过回调函数回调
        Api.get({id: 234}, res =>{
            console.log(res);
        }, err => {
            console.log(err);
        }));
    }
}])

4、设置缓存服务

注:根据http规范,缓存只是在GET请求中有效,本篇所指的缓存也都是指GET请求,你不应该对一个除GET以外的请求设置缓存。

该库设置的缓存分为两种,一是设置持久性的本地缓存,使用localStorage或者indexedDB缓存策略,二是设置angular自带的cache缓存,这种缓存在应用生命周期内有效,关闭应用会自动清除。

设置缓存只需要在装饰器中提供相应的元数据即可,例如:

设置持久性本地缓存,名为‘list’的actions请求的数据将会被保存在本地。

@ResourceParams({
    apiPath: '/app/:id',
    actionsToLocalCache: ['list']
})
class Api extends ApiService{}

设置angular cache缓存:

默认的所有的GET请求都被设置为angular cache缓存的,你可以指定disableCachetrue来禁止缓存所有actions请求,或者指定actionsToCache来设置只有指定的actions请求能够被缓存,disableCache拥有较高的优先级。

@ResourceParams({
    apiPath: '/app/:id',
    disableCache: true
})
class Api extends ApiService{}

更多功能及详细信息请参考高级使用教程。

编译

该库使用了ES6的代理以及ES7的装饰器新特性,所以需要babel来进行编译,下面是一个.babelrc文件的配置,具体的可以参考源文件中example的配置。

{
  "presets": [
    "es2015",
    "stage-0"
  ],
  "plugins": [
    "transform-decorators-legacy"
  ],
  "env": {
    "test": {
      "plugins": [
        "istanbul"
      ]
    }
  }
}

在webpack.config.js文件中,还要把node_modules/ng1-api-service加入编译列表中。

{
    test: /\.js$/,
    use: {
        loader: "babel-loader"
    },
    include: [
        path.resolve(__dirname, 'example'),
        /node_modules(?!\/ng1-api-service)/
    ]
}

高级使用教程

api-service包主要由三部分构成:

  • apiModule模块,包含了一个名为localCacheServiceProvider的提供者,该提供者封装了操作本地缓存的统一API。
  • ResourceParams装饰器,用于在运行时将元数据加入类中。
  • ApiService基类,封装了$resource服务。

1、localCacheServiceProvider提供者

该服务封装了本地缓存的统一API,api-service包提供了两种本地持久性缓存策略:localStorageindexedDB,默认使用localStorage,关于indexedDB的使用请查看IndexedDBindexedDB的使用是非常复杂的,但是在这里你不需要了解这些,因为它被封装为和localStorage一样的API。在存储大数据的时候推荐使用indexedDB

var app = angular.module('app', [apiModule])
    .config(['localCacheServiceProvider', function(localCacheServiceProvider){
    localCacheServiceProvider.setConfig({
        API_SERVER: 'http://localhost:8888'
    });
}]);

localCacheServiceProvider暴露了setConfig方法用来配置本地缓存服务,如以上我们通过API_SERVER字段配置了访问服务器的地址。如果你确定使用localStorage的话,那么以上配置是足够的,如过你想缓存的数据很大,那么推荐使用indexedDB作为缓存策略,此时你需要另外设置以下信息。

localCacheServiceProvider.setConfig({
        API_SERVER: 'http://localhost:8888',
        DB_TYPE: 'indexedDB', //选择indexedDB缓存策略,默认为'localStorage'
        DB_NAME: 'xxx', //数据库名称(可选,默认‘MY_CLIENT_DB’)
        DB_VERSION: 1, //数据库版本号(可选,默认1)
        DB_STORE_NAME: 'yyy'  //存储对象名称(可选,默认‘HTTP_REQUEST_CACHE’)
    });

除开API_SERVERDB_TYPE是必须指定的外,其它的都提供了默认值,是可选的。

2、localCacheService服务暴露的API

  • getApi: function(),返回设置的API_SERVER。
  • getIdentity: function(),获取用户标识。
  • setIdentity: function(identity),设置用户标识。
  • setItem: function(key, data),保存数据。
  • getItem: function(key),获取数据。
  • removeItem: function(key),删除一条数据。
  • clear(),清空全部缓存。
  • clearFuzzyMatch: function(key),模糊匹配删除,会删除以key开头的键的数据。
  • deleteDB: function(),删除数据库(indexedDB模式专有)。
  • closeDB: function(),关闭数据库(indexedDB模式专有)。

这些API你可能都不需要使用到,因为它们主要用于为ApiService基类提供服务。当然你可能在系统中做一个清除缓存的按钮,例如:

app.controller('myCtrl', ['$scope', 'localCacheService', ($scope, localCacheService) => {
    $scope.clear = function() {
        localCacheService.clear();
    };
}]);

3、默认params和actions

默认的提供了以下的paramsactions

const baseParams = {
        id: '@id',
        action: '@action',
        config: '@config'
    };
const baseActions = {
        create: {
            method: 'POST'
        },
        get: {
            method: 'GET'
        },
        list: {
            method: 'GET'
        },
        getAll: {
            method: 'GET',
            isArray: true
        },
        update: {
            method: 'PUT'
        },
        delete: {
            method: 'DELETE'
        }
    };

但是可以通过元数据替换或者修改默认的params或者actions,详情请查看下面的装饰器元数据。

4、@ResourceParams装饰器元数据

下面列出了@ResourceParams装饰器可用的全部元数据,但是你可能一次只会用到其中的一种或几种。

@ResourceParams({
    apiPath: string,
    params: {},
    actions: {},
    getActions: function,
    getParams: function,
    actionsToLocalCache: [],
    disableCache: boolean,
    actionsToCache: [],
    cacheKey: string,
    cacheCapacity: number,
    identity: string
})

apiPath:设置请求的路径,必须指定,如果省略将抛出一个错误。

@ResourceParams({
    apiPath: '/app/:id'
})
class Api extends ApiService{}

params:自定义的params,将和baseParamsangular.merge合并,例如添加一个template_id默认参数

@ResourceParams({
    apiPath: '/app/:template_id'
    params: {
        template_id: ''
    }
})
class Api extends ApiService{}

actions:自定义actions,将和baseActionsangular.merge合并,例如添加一个view方法

@ResourceParams({
    apiPath: '/app/:id'
    actions: {
        view: {
            method: 'GET'
        }
    }
})
class Api extends ApiService{}

getParams:该字段应是一个函数,它的返回值将完全取代baseParams,例如我们设置了以下信息后,我们只能拥有template_id一个默认参数。需要注意的是,一旦设置了getParams你不应该再设置params元数据,因为此时api将忽略params的值,对于getActions也是一样的。

@ResourceParams({
    apiPath: '/app/:template_id'
    getParams: () => {
        return {
            template_id: '@template_id'
        };
}

}) class Api extends ApiService{}

> getActions:该字段应是一个函数,它的返回值将完全取代`baseActions`,例如我们设置了以下信息后,我们只能使用`view`方法。

@ResourceParams({ apiPath: '/app/:id' getActions: () => { return { view: { method: 'GET' } };

}

}) class Api extends ApiService{}

> `actionsToLocalCache`:指定哪些actions方法要持久性的缓存到本地。例如以下我们设置了`get`和`getAll`,这个两个方法请求的数据将会持久性的保存在本地,下次打开浏览器请求的时候会直接从本地读取数据,而不再去请求服务器。

@ResourceParams({ apiPath: '/app/:id' actionsToLocalCache: 'get', 'getAll' }) class Api extends ApiService{}

> `disableCache`:一个`boolean`值,默认为`false`,会将所有actions请求都缓存到angular的cache里,下次请求的时候直接从cache拿而不会去请求服务器。如果设为true,则会禁止angular缓存所有actions请求。

@ResourceParams({ apiPath: '/app/:id' disableCache: true }) class Api extends ApiService{}

> `actionsToCache`:一个数组,用于指定哪些actions请求需要被缓存,一旦设置该数组,则会覆盖默认配置,只有该数组里的方法会被缓存,而其他的则被忽略。需要注意的是,`disableCache`拥有较高的优先级,`disableCache`为`true`的时候不应该再设置该字段,因为此时所有actions请求都被禁止缓存。

@ResourceParams({ apiPath: '/app/:id' actionsToCache: 'list' }) class Api extends ApiService{}

##### 注意:(`disableCache`,`actionsToCache`)和`actionsToLocalCache`没有什么关系,设置(`disableCache`,`actionsToCache`)的值并不会影响本地的持久性缓存,只会影响到`angular`自带的缓存,同样的设置`actionsToLocalCache`也不会影响`angular`的缓存。

> `cacheKey`:一个`string`,用来生成保存数据的key,请指定一个唯一个的值,缺省将使用`apiPath`字段代替。

@ResourceParams({ apiPath: '/app/:id' cacheKey: 'app' }) class Api extends ApiService{}

> `cacheCapacity`:一个`number`,默认20,用于设置angualr cache的容量。

@ResourceParams({ apiPath: '/app/:id' cacheCapacity: 20 }) class Api extends ApiService{}

#### 5、设置用户标识
对于同一个应用的的同一个请求,你也许希望针对不同的用户保存相应的内容。而删除的时候也只是删除相应用户的数据。这时你可以调用`localCacheService`的`setIdentity(identity)`方法。

例如以下用例,在用户登录完成后从后台获取到用户的唯一标识`identity`,然后调用`localCacheService.setIdentity(identity)`,那么每个不同的用户就会保存不同的用户数据副本。

app.controller('myCtrl', 'LoginService,'localCacheService', (localCacheService) => { localCacheService.setIdentity(LoginService.getIdentity()); });

## demo
下面的命令会运行一个本地node服务器,并且打包应用程序。

cd api-service npm install //启动test服务器 node server.js //webpack打包应用 npm run server