如何在angularjs的$resource PUT方法中正确地传递参数给url ?



我有以下代码,一个消耗API rest的工厂:

angular.module('teachers')
.factory("TeachersService",
    function($resource) {
     var restPath = 'http://localhost:8001/entities/teacher/';
     return $resource(restPath + ':id', { id: "@teacherId" }, {
         'getSubjects': {
             method: 'GET',
             url: restPath + ':id' + '/subject',
             isArray: true
         },
         'update': { method: 'PUT'},
         'getClasses': {
             method: 'GET',
             url: restPath + ':id' + '/class',
             isArray: true
         }
     });

    });

在控制器中,我使用factory:

        vm.teacher = TeachersService.get({id: vm.teacherId}, function() {
            console.log(vm.teacher)
        }, function() {
            console.log('Teacher not found')
            vm.teacher = null;
        })

数据检索得很好,但现在我需要更新这个实体的数据,我想使用工厂的更新方法:

            vm.teacher.$update(function() {
                console.log('success')
            }, function(error){
                console.log('error')
                console.log(error)
            });

但是我不知道为什么它总是给我一个失败(这个方法适用于curl和其他程序,如postman)。

这是一个header of fail的例子:

对象{data: null, status: -1, headers: fd/<(), config: Object, statusText: "}

我不明白发生了什么,我想问题出在我传递id的方式上。我确信实体vm.teacher有一个带整数的teacherId值,但我不知道为什么这没有通过。此外,我看到Firefox的网络控制台(在我的情况下),我看到对服务器的调用不存在,但当我将定义更改为id时,像这样,例如:

{ id: "@_teacherId" }

调用完成了,但是出现了错误,因为url的最后没有实体标识符,而PUT方法中的服务器需要它。

一个假用户的例子是(获取后):

Object { createdBy: 1, phone: "+34740 51 73 72", createdAt: "Tue Oct 25 12:58:30 2016", name: "Alvaro", address: "Callejón Lourdes Pozuelo 11 Apt. 54…", teacherId: 4, $promise: Object, $resolved: true }

任何想法?我被阻挡太多次了。

谢谢!

编辑

如果我改变代码并设置GET方法,它会调用:

         'update': {
             method: 'GET',
             url: restPath + ':id'
         }

,但当方法是PUT时不:

         'update': {
             method: 'PUT',
             url: restPath + ':id'
         }

最后,问题出在Flask API上,我需要启用跨域资源共享(Cross-Origin Resource Sharing, CORS)机制。正因为如此,我一次又一次地尝试了这些例子,但没有成功,问题不在$resource代码的末尾。

Status为-1表示AngularJS内部错误,如超时或同源策略/CORS问题。感谢@georgeawg。

在服务中,代码很好:

'update': {method: 'PUT'},

在控制器中它也很好:

 vm.teacher.$update()

在我的flask api中,我需要添加这个:

from flask.ext.cors import CORS, cross_origin
...
app = Flask(__name__)
CORS(app)

关于flask-core的更多信息请参见doc: flask-cors.

相关内容

  • 没有找到相关文章

最新更新