SproutCore 1.8に基づくWebアプリケーションを構築しようとしています。サーバーからデータを取得するために、アプリケーションはCORS要求を別のドメインで実行されているREST Webサービスに送信します。IE9でSproutCoreを使用したクロスオリジンリクエスト
このためのコードは次のようになります。
var request = SC.Request.getUrl('http://example.com/some/path');
request.set('attachIdentifyingHeaders', NO);
request.json().notify(this, this.didFetchData).send();
これはクロム、SafariやFirefoxで素晴らしい作品が、それは実際にはインターネットエクスプローラー9で動作しません、IE9は、JavaScriptエラーに実行されますSproutCoreの内部リクエストの実装で「アクセスが拒否されました」。私は、MicrosoftはIE9でCORS要求用の専用XDomainRequestオブジェクトを実装していることが分かったいくつかの短い調査の後
// initiate request.
rawRequest.open(this.get('type'), this.get('address'), async);
:エラーがこの行で発生します。私はこれらの行(SproutCoreネイティブ要求の実装の選択)から推測するように、これはSproutCoreによってサポートされていないようです:
return tryThese(
function() { return new XMLHttpRequest(); },
function() { return new ActiveXObject('Msxml2.XMLHTTP'); },
function() { return new ActiveXObject('Microsoft.XMLHTTP'); }
);
これはSproutCoreの欠点ですか私は何かが足りないのですか?もしそうなら、私自身の要求抽象化を書かずに、どのようにしてこの問題を回避することができるかについての提案はありますか?
CORSは、私が作業している既存のサーバーインフラストラクチャの要件であることに注意してください。私はクライアントを提供しているサーバーと同じドメインにサービスを置くことも、リバースプロキシや同様のインフラストラクチャの問題を解決することもできません。
ありがとう、これは私が期待していたものです。以前はオプション1が私の心に浮かんでいましたが、これは私がやるべき最後のものだと思います。私はオプション2を試してみます。 – starbugs
それがどのように機能するか教えてください。 ;) – hvgotcodes
両方のオプションが最後に同じ結果になることが分かります。 createRequestだけでなく、invokeTransportとfinishRequestもオーバーライドする必要があります。これにはエラー処理も含まれておらず、多くの繰り返しコードを意味します。 SC.Responseクラスでは、きれいな解決策を実現するために、さらに抽象化が必要になると思います。 XDomainRequestには同じ属性とコールバックがありません。 onreadystatechangeではなくonloadを実装する必要があり、異なるコールバックでエラーをチェックする必要があります。 stackoverflowが自分の質問に答えるとすぐにコードを投稿します。 – starbugs