我正在尝试在我的Appgyver项目中使用$ http REST GET调用,但是我做的任何事情似乎都没有,总是会返回错误。
请注意,角度应用程序最终将在移动设备上运行,然后连接到我的远程Web服务。
我已经仔细检查过我的自定义API是否正常工作并以多种方式正确返回数据,即:
放入http://somesite.com/quote-and-buy-performance/druidapi/taxonomy_term的测试终点返回如下数据:
[{"tid":"1","vid":"2","name":"ACME Ltd.","description":"","format":"filtered_html","weight":"0","parent":"0","uri":"http://somesite.com/quote-and-buy-performance/druidapi/taxonomy_term/1"},{"tid":"2","vid":"2","name":"ABC Films LTD","description":"","format":"filtered_html","weight":"0","parent":"0","uri":"http://somesite.com/quote-and-buy-performance/druidapi/taxonomy_term/2"}]
即使是简单的CSRF令牌请求也会给我带来错误。
有人可能会指出我在这里出错的地方,Appgyver网站记录错误,我尝试过Angular RESTful示例,我的代码基于https://docs.angularjs.org/api/ng/service/ $ http和https://docs.angularjs.org/api/ng/service/ $ HTTP#设定-HTTP报头
请注意下面的代码基本上是使用Javascript语法的Angular.js(而不是Coffeescript),日志输出遵循代码
angular
.module('main')
.controller('LoginController', function($scope, supersonic, $http) {
$scope.navbarTitle = "Settings";
$scope.stoken = "Response goes here";
$scope.processLogin = function(){
var csrfToken;
steroids.logger.log("START CALL: processLogin");
// $form_login_email_address = $scope.login_email;
// $form_login_password = $scope.login_password;
$local_get = "http://somesite.com/quote-and-buy-performance/services/session/token";
$hal_get_taxterm_index = "http://somesite.com/quote-and-buy-performance/druidapi/taxonomy_term";
// $http.defaults.headers.common.contentType('application/json');
var req = {
method: 'GET',
url: $hal_get_taxterm_index,
headers: {
'Content-Type': 'application/json'
}
}
$http(req)
.success(function(data, status, headers) {
steroids.logger.log("Inside http.get() success");
}).error(function(data, status, headers){
steroids.logger.log("Inside http.get() WITH ERROR");
steroids.logger.log('data: ' + data);
steroids.logger.log('status: ' + status);
}).then(function(data, status, headers){
steroids.logger.log("Inside http.get() then");
});
steroids.logger.log("END CALL: processLogin");
}
});
将调用的输出记录到steroids.logger.log
View Time Level Message
main#login 16:01:55.219 info "Inside http.get() WITH ERROR"
main#login 16:01:55.219 info "data: null"
main#login 16:01:55.219 info "status: 0"
main#login 16:01:55.64 info "END CALL: processLogin"
main#login 16:01:55.64 info "START CALL: processLogin"
答案 0 :(得分:1)
如果您的角度应用位于特定域内,则必须在同一域内进行HTTP请求。
在您的情况下,您正在尝试跨域请求(在另一个域上的请求)。然后,您必须提出跨域请求。
您可以看到this question。
作者使用$http.jsonp()
发送跨域请求。迁移是另一种方式。
答案 1 :(得分:1)
这就是我要做的事情:
将您的http电话分离为服务。这是以角度模块化代码的非常标准的方法:
angular.module('main').factory("SomeService", function($http) {
return {
get: function() {
$http({
url: "http://somesite.com/quote-and-buy-performance/druidapi/taxonomy_term",
method: "GET",
headers: {
"Content-Type": "application/json"
}
}).success(function(data, status, headers, config) {
console.log("Success!");
console.log(data);
}).error(function(data, status, headers, config) {
console.log("Error!");
console.log(status);
console.log(data);
});
}
}
})
然后在您的控制器中使用它,只需将它包含在您的控制器声明中,并像通常的方法一样调用get:
angular.module('main').controller('LoginController', function($scope, supersonic, SomeService) {
$scope.navbarTitle = "Settings";
$scope.stoken = "Response goes here";
$scope.processLogin = function(){
var csrfToken;
steroids.logger.log("START CALL: processLogin");
SomeService.get();
steroids.logger.log("END CALL: processLogin");
}
})
执行此操作,然后对结果进行评论,我们可以从那里开始工作。