使用$resource service访问REST API

Access REST API with $resource service

本文关键字:REST API 访问 service resource 使用      更新时间:2023-09-26

我正在努力使$resource服务按预期运行。我试着遵循文档和本教程,似乎提供了一个完整的工作实现。然而,使用这个,我遇到了两个问题。

我的(非常基本的)实现:

the $resource -service:

app.factory('User', function ($resource) {
return $resource(
        'myurl/user/:id', 
        {id: '@_id'}, 
        {
            update: {method: 'PUT'}
        }
       );
});

我在控制器中是怎么称呼它的

$scope.user = User.get({id:$scope.myId});
//save a new user:
$scope.user.$save(function(){location.href = '#/mainpage';});
//delete a user
$scope.user.$delete({id:$scope.myId},function(){location.href = '#/mainpage';});
//update a user
$scope.user.$update({id: user.id}, function(){location.href = '#/mainpage';});

我的问题:

  1. 编辑:解决感谢安德烈Kreienbring。为什么需要为$delete服务指定id {id:$scope.myId} ?根据上面的链接,这应该是自动完成。但是,如果我跳过这个,DELETE将转到myurl/user而不是myurl/user/{myId}

  2. GET返回一个promise,这样$scope.user除了包含用户特定的属性外,还包含$promiseresolved的属性。如果我通过PUT将此发送到我的REST API,请求将被拒绝,因为后端无法将请求体解析为User -Object。

    无法识别的字段"$promise",未标记为可忽略

为了解决这个问题,我尝试在承诺完成时提取数据:

$scope.user = User.get({id:$scope.myId});
$scope.user.$promise.then(function(data){$scope.test = data});

上面代码中的$scope.test仍然包含属性$promiseresolved。我如何发送一个"干净"的json对象到我的REST API不包括$promise ?

关于你的第一个问题:根据$resource的文档:

如果参数值以@为前缀,则为该值的对应属性中提取数据对象(在调用操作方法时提供)

所以,当调用$scope.user.$delete({id:$scope.myId} {id:$scope.myId}是你的数据对象。

您的paramDefaults选项{id: '@_id'}使$resource查找数据对象的'id'的值=> $scope.myId。让我们假设这个值是'123'

URL模板参数随后被此值替换,变为myurl/user/123

你想让你的用户(不大写)服务的方法显式:

app.factory('user', function ($resource) {
    var User = $resource('myurl/user/:userId', {userId:'@id'});
    return {
        get: get
    };
    function get(id){
        return User.get({ userId: id }).$promise;
    }
});
使用

:

user.get($scope.myId).then(function(user){
    $scope.user = user;
});