将AngularJS与非RESTful API集成的最佳方法是什么?

时间:2015-12-01 16:13:36

标签: javascript angularjs angular-ui-router angularjs-service angularjs-factory

我有一个REST API,它有这样的东西:

获取/区域 - 列出所有区域

{
  "zones": [
    {
      "name": "zone 1",
      "persons": [
        0,
        2,
        3
      ],
      "counter" : 3
    },
    {
      "name": "zone 2",
      "persons": [
        1,
        5
      ],
      "counter" : 0
    }
  ]
}

POST /区域 - 创建新区域

{
  "name": "zone 1",
  "persons": [
    0,
    2,
    3
  ]
}

DELETE / zones /:id

删除区域

PUT / zones /:id

更新区域

现在,最后我有了这个:

GET / zones / increment_counter /:id

增加区域的计数器参数。

我正在使用Angular,我正在为Zone对象定义一个工厂,它应该从这个REST API中提供自己。

我见过this example并且它几乎满足了我想要的,除了增量操作,它不遵循RESTful准则。

我无法修改REST API,所以我必须处理这个问题。我该如何处理这些类型的端点?

另外,我应该使用服务还是只能在我的Zone工厂中定义一个方法(例如:zone.incrementCounter()),它直接查询服务器并递增计数器?

我习惯于Java对象,我只需要为类and the class will access the server's endpoints under the hood定义 getters setters

最好的办法是什么?

1 个答案:

答案 0 :(得分:1)

你试过ngResource吗?因为那是你应该开始的地方。

这是一个未经测试的代码段,为您提供它的要点。

<强>工厂

angular.module('MyApplication')
    .factory('ZoneFactory', ['$resource', function($resource) {
        var url = 'www.example.com/api/zones';
        var paramDefaults = {};
        var methods = {
            'get': {
                'url': url,
                'method': 'GET'
            },
            'post': {
                'url':  url,
                'method': 'POST'
            },
            'delete': {
                'url':  url,
                'method': 'DELETE',
                'params': {
                    'id': '@id'
                }
            },
            'put': {
                'url':  url,
                'method': 'PUT',
                'params': {
                    'id': '@id'
                }
            },
            'increment': {
                'url':  url + '/increment_counter',
                'method': 'GET',
                'params': {
                    'id': '@id'
                }
            }
        };
        return $resource(url, paramDefaults, methods);
    }]);

<强>控制器

angular.module('MyApplication')
    .controller('SomeController', ['ZoneFactory', function(ZoneFactory) {
        var mv = this;

        mv.newZone = {
            'name': '',
            'persons': [],
            'counter': 0
        };
        mv.zones = ZoneFactory.get();

        mv.createZone = function() {
            ZoneFactory.post({'zone': mv.newZone});
            mv.zones.push(mv.newZone);

            mv.newZone = {
                'name': '',
                'persons': [],
                'counter': 0
            };
        };
    }]);