2014-04-24 27 views
-1

環境:如何異步設置請求頭中預輸入/獵犬

  • 我使用預輸入/警犬的搜索字段在我的手機應用程序(類固醇/科爾多瓦)
  • 從我的應用程序的每個請求API需要簽名和簽名加權威性頭

顯然設置在阿賈克斯設置標題爲每個請求警犬發送將會有所不同,需要不同的簽名將無法正常工作。

在我的第一個實現中,我使用了beforeSend ajax設置來實現此目的。只需在該函數中計算簽名並將其添加到請求標頭。

但是,這並不是非常安全,所以我決定將所使用的祕密和簽名計算放入Cordova自定義插件的本機代碼中進行編譯。不是防彈的,但有合理的安全性。

由於科爾多瓦插件是異步的,因此beforeSend在這種情況下變得無用。該功能將在標題的簽名和設置完成之前完成。

因此,總之,問題是:我如何異步計算並設置這些標頭的typeahead/bloodhound?

+0

[這是一個類似的問題](http://stackoverflow.com/questions/20453862/jquery-deferred-方法-一個ND-Ajax的beforesend)。儘管沒有任何人提供任何有用的。在我的情況下,我並不特別關心解決方案的可能性(ajax或者bloodhound),只是一些可行的解決方案。這將是如此簡單,如果beforeSend可以只是返回一個承諾:/ –

+0

[another](http://stackoverflow.com/questions/13943196/how-to-properly-utilize-jquery-deferred-promise-on-auto-invoked -function-例如-AS)。在那裏有一個被接受的答案,但它的內容大致如同哈克一樣。我認爲我寧願分叉和攻擊bloodhound,然後把這個解決方法放在我的代碼中:/它也似乎是不可能在ajax選項中做的,所以如果typeahead支持除了向下投票之外沒有其他答案,看起來像這必須是一個獵犬。我很後悔使用打字機/獵頭的決定。 –

回答

1

好的,解決方案似乎是叉子和黑客。首先修改_getFromRemote加入類似remote.replace一個remote.headers選項,除了它返回一個Deferred對象

if (this.remote.headers) { 
    $.when(
     this.remote.headers(url, query, this.remote.ajax) 
    ).done(function(headers) { 
     that.remote.ajax.headers = headers; 
     deferred.resolve(that.transport.get(url, that.remote.ajax, handleRemoteResponse)); 
    }); 
} else { 
    deferred.resolve(this.transport.get(url, this.remote.ajax, handleRemoteResponse)); 
} 

刪除需要beforeSend,然後修改使用該處理get函數遞延

if (matches.length < this.limit && this.transport) { 
    cacheHitPromise = this._getFromRemote(query, returnRemoteMatches); 
    cacheHitPromise.done(function(hit) { 
     if (!hit) { 
      (matches.length > 0 || !this.transport) && cb && cb(matches); 
     } 
    }); 
} 

現在我可以自由地使用異步本地代碼來簽署和設置請求身份驗證標頭:)