1

我在我的 Chrome 扩展程序中加入了 DOI 到格式化的引文功能。dx.doi.org大约在一年前引入了内容协商来支持这种活动。

当我使用修改后的 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 格式返回 10.2331/suisan.32.804 的引文,用于 en-US 语言环境。运行此功能后,当我在任何 Chrome 选项卡中访问http://dx.doi.org/10.2331/suisan.32.804时出现问题(不是通过扩展程序,我的意思是在多功能框中粘贴 url)。该站点返回 406 错误(不接受接受标头请求)。如果我再试一次,页面就会加载。然后,真正的问题是页面加载成功后,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 的表单,这个问题是否同样会出现?
4

1 回答 1

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 请求。我关于标题的问题大多无关紧要。

于 2012-12-03T21:54:09.603 回答