1

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)

今私の質問のために:

  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) にリダイレクトされました。これは、text/html 以外のコンテンツ ネゴシエーションが処理される場所だからです。後で Accept: text/html を使用してリクエストを行ったとき、キャッシュが原因でリクエストはまだ data.crossref.org (または data.datacite.org) を指していました。問題は、data.crossref.org と data.datacite.org が text/html を処理せず、dx.doi.org のみがこれらの要求を処理するため、エラー 406 を返すことです。

つまり、jQuery.ajax に cache:false を追加するだけで、GET リクエストを問題なく使用できるようになります。ヘッダーに関する私の質問はほとんど無関係です。

于 2012-12-03T21:54:09.603 に答える