javascript - XMLHttpRequest 在 Chrome 扩展中修改了 Accept header

标签 javascript google-chrome google-chrome-extension http-headers xmlhttprequest

我在我的 Chrome 扩展程序中加入了 DOI 格式的引用功能。 dx.doi.org introduced content negotiation大约一年前支持这种事件。

当我使用修改后的 Accept header 执行跨域 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 权限在 list 中定义。

该函数运行良好,并以 BibTeX 格式返回 10.2331/suisan.32.804 的引文,适用于 en-US 语言环境。当我访问 http://dx.doi.org/10.2331/suisan.32.804 时出现问题在运行此功能后的任何 Chrome 选项卡中(不是通过扩展程序,我的意思是将 url 粘贴到多功能框中)。该站点返回 406 错误(不接受 Accept header 请求)。如果我再试一次,页面就会加载。然后,真正的问题是页面加载成功后,XMLHttpRequest 不再成功。很明显,我的 header 更改在全局范围内影响了 Chrome,并且不仅限于我的扩展程序的沙箱。我最终通过将 GET 请求更改为 POST 来解决问题,一切都按预期运行。

如果您真的有兴趣亲眼看到这种行为,我打包了一个最小的示例扩展:citeTest.crx (35KB)

现在回答我的问题:

  1. GET:当我发出这个 XMLHttpRequest 时,是 text/bibliography;style=中文提供; locale=en-US 应该附加到我的扩展之外的 Accept header ? (我是否犯了某种形式的错误编程?)
  2. GET:每次我发出这个 XMLHttpRequest 时,都是 text/bibliography;style=中文提供; locale=en-US 被追加,所以最终 Accept header 变得非常非常长?我遇到的一个问题是,每次发出请求时,样式和区域设置可能都会更改,所以我不能只设置一次。
  3. POST:我描述的问题只发生在 GET 请求中。如果用户尝试在 dx.doi.org 上提交基于 POST 的表单,是否会出现类似的问题?

最佳答案

好的,所以我想我已经弄清楚了。由于缓存,问题浮出水面。当 Accept header 设置为 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 请求。我关于标题的问题大多无关紧要。

关于javascript - XMLHttpRequest 在 Chrome 扩展中修改了 Accept header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13666687/

相关文章:

javascript - Angular js是否与jquery multiselect不兼容

javascript - Chrome : Disable same origin policy for localhost

javascript - 跨源请求仅支持协议(protocol)方案 : http, data、chrome、chrome-extension、https

javascript - 悬停时图像变化

javascript - 如何在 JQuery 的事件处理程序中使用外部函数

javascript - 来自后台页面的谷歌浏览器扩展::console.log()?

javascript - 获取 DOM 中的所有 href 链接

google-chrome-extension - 如何从每个页面的背景页面运行 chrome.tabs.insertCSS?

javascript - javascript对象变量只是引用类型吗?

asp.net - 为什么我在共享主机上不断收到 HTTP 403 错误?