Chrome 拡張機能に DOI-to-formatted citation 機能を組み込んでいます。dx.doi.orgは、この種の活動をサポートするために、約 1 年前にコンテンツ ネゴシエーションを導入しました。
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 パーミッションはマニフェストで定義されています。
関数は正常に動作し、en-US ロケールの BibTeX 形式で 10.2331/suisan.32.804 の引用を返します。この関数を実行した後、任意の Chrome タブでhttp://dx.doi.org/10.2331/suisan.32.804にアクセスすると問題が発生します (拡張機能ではなく、オムニボックスに URL を貼り付けることを意味します)。サイトは 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 ベースのフォームを送信しようとすると、この問題が同様に表面化する可能性はありますか?