2012-03-22 51 views
6

我工作的一個自制API消費者以及具有設置Authorization頭嚴重的困難。我使用JQuery的Ajax請求,但「beforeSend」沒有在所有的工作(使用小提琴手審查請求)阿賈克斯授權請求報頭出現故障連連

這是我的beforeSend代碼:

$.ajax({ 
    type: "GET", 
    url: url+"/Projects", 
    contentType: "application/json; charset=utf-8", 
    beforeSend: function (req) { 
     req.setRequestHeader("Authorization", AuthBuilder(username, password)); 
    }, 
    success: function (result) { 
     alert("success"); 
    }, 
    error: function (xhr, ajaxOptions, thrownError) { 
     alert("fail"); 
    } 
}); 

那麼,如果那你失敗了,你做什麼?回到舊的方式發送Ajax請求......嗯,這也不行......

這是我的常規代碼:

function GET(address, callback, error) { 
Request = getXMLHttpObject(); 
Request.open("GET", url + address, true); 

var base64 = Base64.encode(username + ":" + password); 
alert(base64); 
Request.setRequestHeader("Authorization", "Basic " + base64); 

Request.send(); 
Request.onreadystatechange = function() { 
    //alert(Request.readyState+" code "+Request.status); 
    if (Request.readyState == 4 && Request.status == 200) { 
     callback(jQuery.parseJSON(Request.responseText)); 
    } else if (Request.readyState == 4 && Request.status >= 400) { 
     error(Request.status, Request.statusText); 
    } 
} 
} 

不介意的事實,我不要求json,因爲服務返回的json的默認值爲

在附加信息:

  • 產地沒有關係,該服務允許所有起源(已經過測試和確認)
  • 授權工作時頭設置(在其他客戶端測試)
  • 授權頭只是不會發送
  • AuthBuilder(用戶名,密碼))給出了基本認證頭內容
  • 的getXMLHttpObject(正確格式)只是一些副本粘貼代碼和

任何想法之前工作過嗎?

回答

1

那麼我發現問題是什麼。自制的服務發送這回客戶端作爲一個全球性的標題:「訪問控制允許報頭」與它只有「內容類型」。

這樣,我們的客戶不使用的用戶代理(瀏覽器)忽略了這些標題和剛發的頭呢。但是,瀏覽器試圖優化請求,並說:「這不會接受授權頭所以我就在發送之前削減它。」這種方式是封裝更小,服務也不會允許它(雖然它......)

所以只需在訪問控制中添加「授權」允許服務的頭部部分使得我的Javascript/JQuery/Ajax請求正常發送請求標頭!