我在Chrome扩展程序中加入了DOI格式的引文功能。 dx.doi.org introduced content negotiation大约一年前支持这种活动。
当我使用修改后的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)
现在提出我的问题:
答案 0 :(得分:2)
好的,所以我想我已经深究了这一点。由于缓存问题浮出水面。当Accept标头设置为text / bibliography时,请求被重定向到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.
总之,只需将cache:false添加到jQuery.ajax就可以让我使用GET请求了。我对标题的问题大多无关紧要。