我正在编写一个简单的库应用程序,以准备使用AngularJS进行更大的项目。在在线阅读了很多有关$resource
与RESTful
API交互的知识之后,我决定实现它可能会带来一些节省时间和扩展性的好处,而不是$http
用于每个请求。问题是由于某种原因(我不是CORS专家,并且请求正在跨域发送)在使用$save
我的Node.js控制台显示的方法时:
OPTIONS /books 200 1ms - 161b
使用该query()
方法效果很好-节点控制台显示:
GET /books 200 1ms - 228b
在这一点上,我已经停留了几个小时,尝试对以下内容进行变体,但是对于该方法,它最终始终是OPTIONS请求而不是POST(根据Angular文档,应该是POST)$save
。
app.js
var libraryApp = angular.module('libraryApp', ['ngResource', 'ngRoute', 'libraryControllers']);
libraryApp.factory('$book', ['$resource', function ($resource) {
return $resource('http://mywebserver\\:1337/books/:bookId', { bookId: '@bookId' });
}]);
controllers.js
var libraryControllers = angular.module('libraryControllers', []);
libraryControllers.controller('BookCtrl', ['$scope', '$book', function($scope, $book) {
...
$scope.addBook = function () {
var b = new $book;
b.isbn = "TEST";
b.description = "TEST";
b.price = 9.99;
b.$save();
};
}]);
app.js
var express = require('express'),
books = require('./routes/books'),
http = require('http'),
path = require('path');
var app = express();
...
// enable cross-domain scripting
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", req.headers.origin);
res.header("Access-Control-Allow-Headers", "X-Requested-With");
next();
});
// routing
app.get('/books', books.getAll);
app.get('/books/:isbn', books.get);
// This is what I want to fire with the $save method
app.post('/books', books.add);
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
./routes/books.js
...
exports.add = function(req, res) {
console.log("POST request received...");
console.log(req.body.isbn);
};
试图把这行放在我的配置函数中,delete $httpProvider.defaults.headers.common["X-Requested- With"];
但是没有变化。
我不是Angular / Node专业人士,但现在我在想这与跨域有关,就像我说的那样,我不是CORS专家。
提前致谢。
我知道回答自己的问题可能有点不好,但是在发布此问题几天后我就发现了问题。
一切都取决于浏览器如何管理CORS。当使用非“简单”的JavaScript发出跨域请求(即GET请求-
解释该query()
功能为何起作用)时,浏览器将自动向指定的URL / URI发出HTTP OPTIONS请求,称为“ pre-
航班”请求或“承诺”。只要远程源返回200状态的HTTP状态代码以及响应标头中将接受的内容的相关详细信息,浏览器就会继续执行原始的JavaScript调用。
这是一个简短的jQuery示例:
function makeRequest() {
// browser makes HTTP OPTIONS request to www.myotherwebsite.com/api/test
// and if it receives a HTTP status code of 200 and relevant details about
// what it will accept in HTTP headers, then it will make this POST request...
$.post( "www.myotherwebsite.com/api/test", function(data) {
alert(data);
});
// ...if not then it won't - it's that simple.
}
我要做的就是在响应头中添加服务器将接受的详细信息:
// apply this rule to all requests accessing any URL/URI
app.all('*', function(req, res, next) {
// add details of what is allowed in HTTP request headers to the response headers
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
res.header('Access-Control-Allow-Credentials', false);
res.header('Access-Control-Max-Age', '86400');
res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
// the next() function continues execution and will move onto the requested URL/URI
next();
});
然后在Express路由之前插入以下几行,以简单地为每个OPTIONS请求返回HTTP 200状态代码:
// fulfils pre-flight/promise request
app.options('*', function(req, res) {
res.send(200);
});
希望这可以帮助在此页面上偶然遇到相同问题的任何人。
问题内容: 我有一些旧代码通过jQuery的post方法发出AJAX POST请求,看起来像这样: 只是具有一些基本字符串属性的javascript对象。 我正在移动我们的内容以使用Angular,并且我想用$ http.post代替此调用。我提出以下内容: 当我这样做时,我从服务器收到500错误响应。使用Firebug,我发现这发送了如下请求体: 成功的jQuery 发送如下内容: 我要命中的端
本文向大家介绍AngularJS实现ajax请求的方法,包括了AngularJS实现ajax请求的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了AngularJS实现ajax请求的方法。分享给大家供大家参考,具体如下: 【HTML 代码】 【js代码 ajax.js】 【PHP代码 ajax.php】 更多关于AngularJS相关内容感兴趣的读者可查看本站专题:《AngularJS
本文向大家介绍angularJS 发起$http.post和$http.get请求的实现方法,包括了angularJS 发起$http.post和$http.get请求的实现方法的使用技巧和注意事项,需要的朋友参考一下 AngularJS发起$http.post请求 代码如下: 这时候你会发现收不到返回的数据,结果为null,这是因为要转换成form data。 解决方案: 配置$httpProv
问题内容: 我查看了用于$ resource的AngularAPI,但没有找到将s发送到RESTful服务的方法。 我知道使用$http方法是可能的,所以,也可以使用吗? 显然,这是的选项。 动作 – {string} –动作的名称。该名称成为资源对象上方法的名称。 方法 – {string} – HTTP请求方法。有效方法为:GET,POST,PUT,DELETE和JSONP params –
问题内容: 我想从我的API请求资源时发送身份验证令牌。 我确实使用$ resource实现了服务: 我有一个存储身份验证令牌的服务: 我想通过服务发送的每个请求都发送令牌。通过将其放入特定动作的调用中,我能够发送它。例如,这有效: 但是我宁愿将access_token定义为服务中的参数,因为它必须随每个调用一起发送。并提高干度。但是工厂中的所有内容仅执行一次,因此access_token在定义工
问题内容: 假设这样的服务: 所以应该这样使用: 因此,当我发送GET请求时,一切正常,构建了ur + params: 问题,为什么我有: 如果我的GET请求导致从服务器返回的json- response:那么我希望我的数据被填满。 我是否应该以某种方式等待诺言已经准备就绪/已解决? 问题答案: 不会立即返回您的实际数据。当ajax返回时,它返回的内容将保存您的数据。在那个()上,您可以注册一个附