前缀$ http url

时间:2013-06-18 10:47:03

标签: angularjs

我似乎无法找到一个似乎是合理问题的答案。

我使用$ http服务为我的所有应用调用Web服务。所有服务器API都托管在特定地址。有没有什么方法可以让$ http总是在提供的URL前加上API服务器?

例如,如果我的API位于http://myAPi/API/,我希望能够致电:

$http.get("User")...

而不是:

$http.get("http://myAPI/API/User")

Angular将请求作为服务器地址的前缀。目的是不在整个应用程序中传播URL。

有没有办法用Angular实现这个目标?

3 个答案:

答案 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');

您只需编辑配置:)