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

Ale*_*eco 2 api rest http alfresco angularjs

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

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

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

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

GET /alfresco/s/api/people/admin/preferences?alf_ticket=TICKET_f79aa9eb2f839cefd1e1c7e4f579379ec06c33ed
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 为每个$ resource实例使用参数化URL(例如/alfresco/s/api/people/admin/preferences:alf_ticket); 然后通过parameterDefault适当的函数提供从当前会话数据中获取令牌.
  2. 类似于本博文中描述的方法,最初受到其他Stackoverflow问题的启发.但我发现它有点干扰,所以我可能选择1.

理想情况下,我会寻找$ resource$ http的全局配置,类似于配置默认头文件($httpProvider.defaults.headers)的方式,但我担心这两种服务都不提供这样的功能......

Mar*_*ine 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;
    }
  };
})
Run Code Online (Sandbox Code Playgroud)

(请注意,我使用URI.js来添加参数,因为我在这篇博文之后设计了我的答案,作者也使用了它)

传递$httpProvider到你的config块,并把你的拦截服务到其名称的字符串interceptor数组:

.config(function ($httpProvider) {
  $httpProvider.interceptors.push('httpRequestInterceptor');
})
Run Code Online (Sandbox Code Playgroud)

在浏览器执行之前,任何$http请求(包括那些请求$resource)都将被截获并修改(如果适用).

Plunker演示