8

对于看似合理的问题,我似乎找不到答案。

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

例如,如果我的 API 在http://myAPi/API/,我希望能够调用:

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

相对于:

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

Angular 在请求前加上服务器地址。目的是不让 URL 散布在整个应用程序中。

有没有办法用 Angular 实现这一点?

4

3 回答 3

6

这是一个老问题,但我前段时间提出了解决方案

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);
    }
  }
}
于 2016-05-03T16:42:30.530 回答
5

由于 $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')

无论哪种方式都会导致“没有在整个应用程序中传播 URL”。

于 2013-08-29T07:12:19.343 回答
-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');

你只需要编辑配置:)

于 2013-11-25T14:48:47.217 回答