我在我的Chrome擴展中引入了DOI對格式的引用功能。大約一年前,dx.doi.org introduced content negotiation支持這種活動。Chrome擴展中帶有修改的Accept頭的XMLHttpRequest
當我使用修改後的Accept頭執行跨域XMLHttpRequest時,我注意到了Chrome中一些奇怪的行爲。下面是再現問題的功能的一個小例子(以下jQuery的使用,但完全相同的行爲使用XMLHttpRequest注意到):
function getCitation() {
var resolveUrl = "http://dx.doi.org/10.2331/suisan.32.804";
var content = 'text/bibliography; style=bibtex; locale=en-US';
document.getElementById("notify").innerHTML = "Loading...";
var jqxhr = jQuery.ajax({
url: resolveUrl,
headers: { Accept: content },
dataType: "text",
type: "GET"
});
jqxhr.done(function() {
document.getElementById("notify").innerHTML = jqxhr.responseText;
});
jqxhr.error(function() {
document.getElementById("notify").innerHTML = "No citation found";
});
}
一些額外的信息:* .doi.org和* .crossref.org權限在清單中定義。
該函數可以正常工作,並返回bibTeX格式中en-US語言環境的10.2331/suisan.32.804的引用。當我在運行這個函數後(不是通過擴展名,我的意思是將網址粘貼到多功能框中)運行後,我在Chrome瀏覽器中訪問http://dx.doi.org/10.2331/suisan.32.804時出現問題。該站點返回一個406錯誤(Accept頭請求不被接受)。如果我再試一次,頁面加載。然後,真正的踢球者是在頁面加載成功之後,XMLHttpRequest不再成功。所以顯然,我的標題變更在全球範圍內影響着Chrome,並不僅限於我的擴展程序的沙箱。我最終通過將GET請求更改爲POST以及所有功能來解決問題。
如果你在看到這種行爲的第一手資料很感興趣,我打包的小例子擴展:citeTest.crx(35KB)
現在對於我的問題:
- GET:當我做這個的XMLHttpRequest ,是文/參考書目;風格=中文提供; locale = en-US應該附加到我的擴展外部的Accept標頭中? (我是否犯了某種形式的錯誤編程?)
- GET:每次我發出這個XMLHttpRequest,都是文/參考書目;風格=中文提供; locale = en-US正在追加,所以最終Accept頭真的很長?我遇到的一個問題是樣式和語言環境設置可能會在每次發出請求時發生變化,因此我無法將其設置爲一次。
- POST:我描述的問題只發生在GET請求中。如果用戶試圖在dx.doi.org上提交一個基於POST的表單,這個問題是否同樣會出現?