假设我需要在用户发出的每个请求中包含GroupId参数,但我不想修改每个服务调用以包含该请求。是否可以将GroupId自动附加到所有请求,无论是POST还是GET查询字符串?
我一直在研究拦截器request
功能,但无法弄清楚如何进行更改
**编辑**
下面的当前工作样本是Morgan Delaney和haimlit建议的组合(我认为无论如何它都是一个组合)。基本思想是,如果请求是POST,请修改config.data
。对于GET,请修改params
。似乎到目前为止工作。
仍然不清楚提供者系统如何在Angular中工作,所以我不确定在这里修改data.params属性是否完全合适。
.config(['$httpProvider', function ($httpProvider) {
$httpProvider.interceptors.push(['$rootScope', '$q', 'httpBuffer', function ($rootScope, $q, httpBuffer) {
return {
request: function (config) {
if (config.data === undefined) {
//Do nothing if data is not originally supplied from the calling method
}
else {
config.data.GroupId = 7;
}
if (config.method === 'GET') {
if (config.params === undefined) {
config.params = {};
}
config.params.GroupId = 7;
console.log(config.params);
}
return config;
}
};
} ]);
} ]);
答案 0 :(得分:7)
如果您的示例有效,那很好。但它似乎缺乏语义恕我直言。
在我的评论中,我提到了创建服务,但我已经使用工厂设置了一个示例Plunker。
相关代码:
angular.module( 'myApp', [] )
.factory('myHttp', ['$http', function($http)
{
return function(method, url, args)
{
// This is where the magic happens: the default config
var data = angular.extend({
GroupId: 7
}, args );
// Return the $http promise as normal, as if we had just
// called get or post
return $http[ method ]( url, data );
};
}])
.controller( 'myCtrl', function( $scope, $http, myHttp )
{
// We'll loop through config when we hear back from $http
$scope.config = {};
// Just for highlighting
$scope.approved_keys = [ 'GroupId', 'newkey' ];
// Call our custom factory
myHttp( 'get', 'index.html', { newkey: 'arg' }).then(function( json )
{
$scope.config = json.config;
});
});