AJAX 方式でサーバーに JSON データを照会する Web ベースのツールに問題があります。正しく動作していません - 返された結果はしばしば私が望むものではなく、サーバーがリクエストを処理するのに多くの時間を待つ必要があります.
実のところ、私は常に同じデータ (正確には数人程度) が返されることを望んでいるので、サーバーの応答を偽造することを考えました。いくつかの方法でこれを達成しようとしましたが、成功しませんでした。
Chrome の WebRequest 機能を使用してみました。拡張機能を用意し、JSON エンコードされたデータ URL にリクエストをリダイレクトしました。それは機能しましたが、Chrome のアドレス フィールドにアドレスを手動で入力した場合のみでした。Web アプリがアドレスにアクセスしようとすると、リダイレクトがサイレント モードで失敗しました。私はすぐに Access Origin の制限について考え、すぐに Access-Control-Allow-Origin ヘッダーを送信する Web サーバーをセットアップしました。
残念ながら、これもうまくいきませんでした。手でアドレスを入力すると、サーバーがクエリされ、正しい JSON が返されましたが、アプリではリクエストが... 黙って失敗しました。Chrome はサーバーにクエリを実行していないため、可能性のある Access-Control-Allow-Origin ヘッダーを完全に無視しているように見えました。問題のあるリクエストをアプリのドメイン内のランダムな URL にリダイレクトしたときに、Chrome が URL のみを分析する可能性は十分にあります。
また、同じ方法を使用して、ドキュメントに静的にリンクされている (たとえば、標準の script タグを介して含まれている) アプリの JavaScript ファイル全体を偽造しようとしました。私は惨めに失敗しました-リダイレクトは、最初の試行で失敗したように、静かに失敗しました。
私の問題に対する一般的な解決策は、サーバー出力を変更するある種のプロキシを使用することですが、それはできません。サーバーがリクエストを処理するのを数分待ちたくありません。ちなみに、このアプリには HTTPS 経由でのみアクセスできます。
ハードコーディングされた JSON をアプリに供給する他の方法はありますか? それとも、何かが足りないのでしょうか?
「catblock」の例に基づくEDITプラグインコード:
chrome.webRequest.onBeforeRequest.addListener(
function(info) {
console.log("AJAX call intercepted: " + info.url)
return {redirectUrl: 'data:application/json,"test"'};
},
// filters
{
urls: [
"*://address.to.the.js.file.requested"
]
}, ['blocking']);
マニフェスト ファイル、ドメインのみを権限セクションに追加しました。
{
"name": "CatBlock",
"version": "1.0",
"description": "I can't has cheezburger!",
"permissions": ["webRequest", "webRequestBlocking",
"*://some.domain.com/*"],
"background": {
"scripts": ["background.js"]
},
"manifest_version": 2
}
編集 2:
これは、Chrome の開発者コンソールのネットワーク パネルのスクリーンショットで、リクエストがサイレントにキャンセルされることを示しています。