Angular REST 不能 return 简单数据
Angular REST cannot return simple data
我正在尝试让 $http REST GET 调用在我的 Appgyver 项目中正常工作,但我所做的一切似乎都不对,总是 returns 错误。
请注意 angular 应用程序最终会 运行 在移动设备上,然后连接到我的远程网络服务。
我仔细检查了我的自定义 API 是否正常工作并以多种方式正确返回数据,即:
- 来自终端 sh 文件的硬编码 cUrl 请求 运行 - Returns 数据和正确的 200 代码
- 在 POSTMAN 和 Firefox 的 SOA 客户端中测试了 API 端点。
将我的http://somesite.com/quote-and-buy-performance/druidapi/taxonomy_termreturns数据的测试终点放入如下:
[{"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 示例,我的下面的代码基于 [=16] =]$http#setting-http-headers
请注意下面的代码基本上是 Angular.js 使用 Javascript 语法(而不是 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"
如果您的 angular 的应用程序在某个域中,则必须在同一域中进行 HTTP 请求。
在您的情况下,您正在尝试跨域请求(另一个域上的请求)。然后您必须提出跨域请求。
可以看到this question.
作者使用$http.jsonp()
发送跨域请求。可能还有另一种方法。
我会这样做:
将您的 http 调用分离到一个服务中。这是在 angular:
中模块化代码的一种非常标准的方法
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");
}
})
执行此操作,然后反馈您的结果,我们可以从那里开始工作。
我正在尝试让 $http REST GET 调用在我的 Appgyver 项目中正常工作,但我所做的一切似乎都不对,总是 returns 错误。
请注意 angular 应用程序最终会 运行 在移动设备上,然后连接到我的远程网络服务。
我仔细检查了我的自定义 API 是否正常工作并以多种方式正确返回数据,即:
- 来自终端 sh 文件的硬编码 cUrl 请求 运行 - Returns 数据和正确的 200 代码
- 在 POSTMAN 和 Firefox 的 SOA 客户端中测试了 API 端点。
将我的http://somesite.com/quote-and-buy-performance/druidapi/taxonomy_termreturns数据的测试终点放入如下:
[{"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 示例,我的下面的代码基于 [=16] =]$http#setting-http-headers
请注意下面的代码基本上是 Angular.js 使用 Javascript 语法(而不是 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"
如果您的 angular 的应用程序在某个域中,则必须在同一域中进行 HTTP 请求。
在您的情况下,您正在尝试跨域请求(另一个域上的请求)。然后您必须提出跨域请求。
可以看到this question.
作者使用$http.jsonp()
发送跨域请求。可能还有另一种方法。
我会这样做:
将您的 http 调用分离到一个服务中。这是在 angular:
中模块化代码的一种非常标准的方法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");
}
})
执行此操作,然后反馈您的结果,我们可以从那里开始工作。