在RESTAdapter初始化之后添加标头

时间:2014-01-31 21:33:46

标签: ember.js ember-data

我正在尝试在初始化和使用适配器后向我的适配器请求添加Authorization标头。我可以在创建ApplicationAdapter时以静态方式添加标头,但我似乎无法在后续REST调用中使用标头。我正在尝试这个:

var auth= "Basic " + hash;
App.ApplicationAdapter.reopen({
    headers: {
        Authorization: auth
    }
});

我在RESTAdapter方法中调试ajaxadapter.headers的测试始终为undefined

3 个答案:

答案 0 :(得分:9)

接受的答案并没有解决推荐的方法在ember-data中不起作用的事实。我说推荐自:

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/adapters/rest_adapter.js#L88

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/adapters/rest_adapter.js#L162 和该档案中的其他地方。

此外,OP提出的未定义的问题具体发生在这里: https://github.com/emberjs/data/blob/master/packages/ember-data/lib/adapters/rest_adapter.js#L619

所以,以下内容根本不起作用:

App.ApplicationAdapter.reopen({
  headers: {token: 'reopen_token (NO WORK)' }
});

我试图指出这是一个问题,但它在一小时内关闭: https://github.com/emberjs/data/issues/1820

希望核心将决定修复此问题或删除评论。但是,是的,现在看来你必须劫持jQuery ajax设置,Ember。$。ajaxPrefilter,或者自己覆盖适配器上的ajax

编辑:因此,在从Ember开发者那里获得更多反馈之后,看起来这个问题的核心是尝试重新打开已经创建的实例。因此,在定义时使用computered属性(因此它将根据需要更新)似乎是建议的方法。希望有所帮助(最近合并的拉取请求使得在引用文件的注释中更加明显:https://github.com/emberjs/data/pull/1818/files#diff-1d7f5a5b77898df15de501c3c38d4829R108

编辑2 :在我的应用中使用了这个代码以防其他人被卡住:

//app.js
App.ApplicationAdapter = DS.ActiveModelAdapter.extend({
  namespace: 'api/v1',
  headers: function() {
    return {
      token: this.get('App.authToken') || localStorage.getItem('token')
    };
  }.property("App.authToken")
});

//login-controller.js (only action shown..assume `data` has user/pass)
  actions: {
    login: function() {
        $.post('/token/', data).done(function(user) {
          App.set('authToken', user.token);
          //Above will trigger adapters's header computed property to update

          // Transition to previous attempted route
          var attemptedTransition = self.get('attemptedTransition');
          if(attemptedTransition) {
            attemptedTransition.retry();
          }
          else {
            self.transitionToRoute('yourapproute');
          }
        })
        .fail(function(response) { 
          //fail handling omitted
        });

答案 1 :(得分:1)

答案已在官方API文件中引入。

http://emberjs.com/api/data/classes/DS.RESTAdapter.html#toc_headers-customization

  • 将计算属性与会话注入一起使用
  • 或只使用volatile计算属性

答案 2 :(得分:0)

您应该可以使用$.ajaxPrefilter添加自定义标头(或参数)。

请参阅:http://api.jquery.com/jQuery.ajaxPrefilter/

Ember.$.ajaxPrefilter(function( options, oriOptions, jqXHR ) {
  var auth= "Basic " + hash;
  jqXHR.setRequestHeader("Authorization", auth);
});