Flask API:如何在 angularjs $resource PUT 方法中正确地将参数传递给 url?
Flask API: How can I pass a param to url in angularjs $resource PUT method correctly?
我有以下代码,一个消耗 API 休息的工厂:
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
}
});
});
在我使用工厂的控制器中:
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 和其他程序,如邮递员)。
这是 header 失败的示例:
Object { 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,我需要在其中启用跨源资源共享 (CORS) 机制。因此,我一次又一次地尝试了这些示例,但都没有成功,问题不在最后的 $resource 代码中。
-1 的状态表示 AngularJS 内部错误,例如超时或同源 Policy/CORS 问题。 感谢@georgeawg。
在服务中代码很好:
'update': {method: 'PUT'},
在控制器中也很好:
vm.teacher.$update()
在我的烧瓶中 api 我需要添加这个:
from flask.ext.cors import CORS, cross_origin
...
app = Flask(__name__)
CORS(app)
文档中有关 flask-core 的更多信息:flask-cors。
我有以下代码,一个消耗 API 休息的工厂:
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
}
});
});
在我使用工厂的控制器中:
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 和其他程序,如邮递员)。
这是 header 失败的示例:
Object { 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,我需要在其中启用跨源资源共享 (CORS) 机制。因此,我一次又一次地尝试了这些示例,但都没有成功,问题不在最后的 $resource 代码中。
-1 的状态表示 AngularJS 内部错误,例如超时或同源 Policy/CORS 问题。 感谢@georgeawg。
在服务中代码很好:
'update': {method: 'PUT'},
在控制器中也很好:
vm.teacher.$update()
在我的烧瓶中 api 我需要添加这个:
from flask.ext.cors import CORS, cross_origin
...
app = Flask(__name__)
CORS(app)
文档中有关 flask-core 的更多信息:flask-cors。