覆盖 Angular $http post 以使用附加数据扩展每个 post 数据
Overriding Angular $http post to extend every post data with additional data
在 Yii 框架中,我们必须向 POST 数据添加一个 CSRF 令牌,以便可以验证请求。
令牌由 PHP 生成,我正在像这样传递变量
angular.module('MyConstant', []).constant("MyConstant",
{'postdata': {'_csrf': 'ABCDEF'}}); //this is written by PHP
var app = angular.module('MyApp', ['MyConstant']);
app.controller('MyCtrl', [
'$scope', '$http', 'MyConstant',
function ($scope, $http, MyConstant) {
}]);
每当我想发送 POST 时,我都必须这样做。
$http.post(url, angular.extend(MyConstant.postdata, {data: mydata}));
POSTbody会是这样
{"_csrf": "ABCDEF", "data": "bla bla bla"}
我很好奇是否有 "Angular way" 来覆盖 $http.post
以自动附加数据以避免像上面的 angular.extend(ViewConstants.postdata
那样的代码重复。
更新
感谢@GregL 指点。我可以使用 interceptors
这样做
app.config(['$httpProvider', 'MyConstant',
function ($httpProvider, MyConstant) {
$httpProvider.interceptors.push(function () {
return {
request: function (config) {
if (config.method == "POST"){
config.data = angular.extend(MyConstant.postdata, config.data);
}
return config;
}
};
});
}]);
是的,您应该可以注册 interceptor。
只需为 request
方法添加一个拦截器,并检查是否 config.method === 'POST'
如果是,则将您的常量添加到发送的数据中 (config.data
).
在 Yii 框架中,我们必须向 POST 数据添加一个 CSRF 令牌,以便可以验证请求。
令牌由 PHP 生成,我正在像这样传递变量
angular.module('MyConstant', []).constant("MyConstant",
{'postdata': {'_csrf': 'ABCDEF'}}); //this is written by PHP
var app = angular.module('MyApp', ['MyConstant']);
app.controller('MyCtrl', [
'$scope', '$http', 'MyConstant',
function ($scope, $http, MyConstant) {
}]);
每当我想发送 POST 时,我都必须这样做。
$http.post(url, angular.extend(MyConstant.postdata, {data: mydata}));
POSTbody会是这样
{"_csrf": "ABCDEF", "data": "bla bla bla"}
我很好奇是否有 "Angular way" 来覆盖 $http.post
以自动附加数据以避免像上面的 angular.extend(ViewConstants.postdata
那样的代码重复。
更新
感谢@GregL 指点。我可以使用 interceptors
app.config(['$httpProvider', 'MyConstant',
function ($httpProvider, MyConstant) {
$httpProvider.interceptors.push(function () {
return {
request: function (config) {
if (config.method == "POST"){
config.data = angular.extend(MyConstant.postdata, config.data);
}
return config;
}
};
});
}]);
是的,您应该可以注册 interceptor。
只需为 request
方法添加一个拦截器,并检查是否 config.method === 'POST'
如果是,则将您的常量添加到发送的数据中 (config.data
).