我似乎无法找到一个似乎是合理问题的答案。
我使用$ http服务为我的所有应用调用Web服务。所有服务器API都托管在特定地址。有没有什么方法可以让$ http总是在提供的URL前加上API服务器?
例如,如果我的API位于http://myAPi/API/
,我希望能够致电:
$http.get("User")...
而不是:
$http.get("http://myAPI/API/User")
Angular将请求作为服务器地址的前缀。目的是不在整个应用程序中传播URL。
有没有办法用Angular实现这个目标?
答案 0 :(得分:5)
这是一个老问题,但我前段时间做了一个解决方案
angular
.module('app')
.config(function ($httpProvider) {
$httpProvider.interceptors.push(apiInterceptor);
});
// api url prefix
var API_URL = 'http://localhost:8080/';
function apiInterceptor ($q) {
return {
request: function (config) {
var url = config.url;
// ignore template requests
if (url.substr(url.length - 5) == '.html') {
return config || $q.when(config);
}
config.url = API_URL + config.url;
return config || $q.when(config);
}
}
}
答案 1 :(得分:4)
由于$ http没有内置的处理这种情况的方法(除了编辑angular.js源代码),你可以将$ http包装在服务中:
apiService.get('user'); //where the service defines the $http call and builds the URL
...或者只是创建一个角度常数:
angular.module('myApp', []).constant('apiPrefix', 'http://myAPI/API/')
$http.get(apiPrefix + 'User')
无论哪种方式都会导致“没有在整个应用中传播网址”。
答案 2 :(得分:-1)
可以向http提供程序添加拦截器。
// register the interceptor as a service
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
return {
// optional method
'request': function(config) {
// do something on success
return config || $q.when(config);
}
}
然后你注册你的拦截器。
$httpProvider.interceptors.push('myHttpInterceptor');
您只需编辑配置:)