当POST到服务层中的端点以更新用户的配置文件时,我需要从请求有效负载中删除某些值(具有客户端所需修改的配置文件)并将其重新附加到响应有效负载(来自服务器的更新的配置文件)。我目前正在使用Angular' request and response transformers执行行为,如下所示:
myService.updateProfile = function (profile) {
return $http({
method: 'POST',
withCredentials: true,
url: root + 'users/profile',
data: profile,
transformRequest : requestTransformer,
transformResponse : responseTransformer
});
};
// the map used during transformation below
var myMap = {
0: 'foo',
1: 'bar',
2: 'etc'
};
// prependTransform() and appendTransform() are similar to the example provided in Angular transformer docs here:
// https://docs.angularjs.org/api/ng/service/$http#overriding-the-default-transformations-per-request
var requestTransformer = httpTransformer.prependTransform($http.defaults.transformRequest, function(profileRequest) {
profileRequest.myKey = myMap.indexOf(profileRequest.myValue);
delete profileRequest.myValue;
return profileRequest;
});
var responseTransformer = httpTransformer.appendTransform($http.defaults.transformResponse, function(profileResponse) {
profileRequest.myValue = myMap[profileRequest.myKey];
delete profileRequest.myKey;
return profileResponse;
});
我将变换器添加到默认请求变换器,并将变换器附加到默认响应变换器。我的问题是,有更好的方法吗?也许使用interceptors, as documented here,代替?如果是这样,怎么样?
答案 0 :(得分:0)
我认为您的解决方案很好,但如果您想要替代方案,您可以拦截这样的特定请求。 HTTP拦截器主要用于处理全局HTTP请求/响应(身份验证,错误处理等)。
在任何情况下,都应该从API /服务器端处理“响应”有效负载。
$provide.factory('userProfileInterceptor', function() {
return {
request: function(config) {
if (config.url.indexOf('/users/profile') >=0){
if (config.params.myValue) delete config.params.myValue;
}
return config;
},
response: function(response) {
if (response.config.url.indexOf('/users/profile') >=0){
delete response.data.myKey;
}
return response;
}
};
});
$httpProvider.interceptors.push('userProfileInterceptor');