1

我在我的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)

現在對於我的問題:

  1. GET:當我做這個的XMLHttpRequest ,是文/參考書目;風格=中文提供; locale = en-US應該附加到我的擴展外部的Accept標頭中? (我是否犯了某種形式的錯誤編程?)
  2. GET:每次我發出這個XMLHttpRequest,都是文/參考書目;風格=中文提供; locale = en-US正在追加,所以最終Accept頭真的很長?我遇到的一個問題是樣式和語言環境設置可能會在每次發出請求時發生變化,因此我無法將其設置爲一次。
  3. POST:我描述的問題只發生在GET請求中。如果用戶試圖在dx.doi.org上提交一個基於POST的表單,這個問題是否同樣會出現?

回答

1

好吧,所以我想我已經到了這個底部。由於緩存,問題浮出水面。當Accept頭被設置爲文本/參考書目時,請求被重定向到data.crossref.og(或data.datacite.org),因爲這是處理非文本/ html內容協商的地方。當我稍後用Accept:text/html發出請求時,由於緩存,請求仍然指向data.crossref.org(或data.datacite.org)。問題是,data.crossref.org和data.datacite.org不處理text/html,只有dx.doi.org處理這些請求,所以他們返回錯誤406.

總之,只需添加緩存:假如jQuery.ajax允許我使用GET請求就好了。我關於標題的問題大多不相關。

相關問題