【问题标题】:Provide default parameters automatically with $resource?使用 $resource 自动提供默认参数?
【发布时间】:2014-05-20 02:04:06
【问题描述】:

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

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

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

这种场景下,恐怕只能把每次请求中的alf_tickettoken作为参数发送给后端,例如:

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。

理想情况下,我会寻找 $resource$http 的全局配置,类似于配置默认标头 ($httpProvider.defaults.headers) 的方式,但恐怕两者都没有提供这样的功能服务...

【问题讨论】:

    标签: angularjs api http rest alfresco


    【解决方案1】:

    使用 $http 拦截器。

    创建一个工厂函数,用于重新配置任何 URL 的请求,仅在设置了身份验证令牌时才将其添加到参数中:

    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

    【讨论】:

    • 很好的答案,这看起来是一个非常合适的解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 2011-02-23
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    相关资源
    最近更新 更多