使用$ resource自动提供默认参数?

时间:2014-05-19 16:14:49

标签: angularjs api http rest alfresco

我正在创建一个简单的AngularJS应用,该应用使用Alfresco作为提供的REST API的后端。

首先,通过返回令牌(alf_ticket)的适当服务执行身份验证,并且在成功进行身份验证后,该令牌必须作为URL参数发送到后续请求中。

就我而言,Alfresco REST API不支持接收令牌作为HTTP标头的一部分;这可能是最好的选择,因为通过配置$ http默认值来解决问题会很简单,只需提一个我能想到的选项。

在这种情况下,我担心我只能将每个请求中的alf_ticket令牌作为参数发送到后端,例如:

GET /alfresco/s/api/people/admin/preferences?alf_ticket=TICKET_f79aa9eb2f839cefd1e1c7e4f579379ec06c33ed

我知道$resource提供了默认参数的机制,但这些是$ resource的每个实例的特定默认值。

到目前为止,我一直在考虑以下方法:

  1. 为每个$ resource实例使用参数化URL(例如/alfresco/s/api/people/admin/preferences:alf_ticket);然后通过parameterDefault提供从当前会话数据中获取令牌的适当函数。
  2. 类似于this blog post中描述的方法,最初受到其他Stackoverflow question的启发。但我觉得它有点干扰,所以我可能选择1。
  3. 理想情况下,我会寻找$resource$http的全局配置,类似于配置默认标头($httpProvider.defaults.headers)的方式,但我担心这样两种服务都没有提供功能......

1 个答案:

答案 0 :(得分:9)

使用$ http拦截器。

创建一个工厂函数,该函数重新配置任何URL的请求,只有在设置参数时才将auth令牌添加到参数中:

app.factory('httpRequestInterceptor', function (Auth) {
  return {
    request: function (config) {
      if (Auth.token) {
        config.url =  URI(config.url).addSearch({'_auth_token':Auth.token}).toString();
      }
      return config;
    }
  };
})

(请注意,我使用URI.js添加参数,因为我在this blog post之后设置了答案,作者也使用了该答案。

$httpProvider传递到config块,并将拦截器服务的名称字符串推送到其interceptor数组中:

.config(function ($httpProvider) {
  $httpProvider.interceptors.push('httpRequestInterceptor');
})

在浏览器执行之前,任何$http个请求(包括$resource包含的请求)都会被截获并修改(如果适用)。

Plunker Demo