我正在嘗試基於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();
這工作在Chrome,Safari和Firefox偉大的,但它不會在Internet Explorer 9的工作事實上,IE9運行到一個JavaScript錯誤SproutCore內部請求實現中的「拒絕訪問」。錯誤引發在這行:
// initiate request.
rawRequest.open(this.get('type'), this.get('address'), async);
經過一番短暫的調查,我發現,微軟實現了在IE9 CORS請求的專用XDomainRequest對象。這似乎並不受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 2012-04-24 12:17:04
讓我知道它是如何工作的。 ;) – hvgotcodes 2012-04-24 12:56:33
原來這兩個選項最終歸結爲相同的結果。您不僅必須重寫createRequest,還必須重寫invokeTransport和finishRequest。這甚至不包括錯誤處理,並且意味着很多重複的代碼。我認爲SC.Response類需要更多的抽象概念來提供一個乾淨的解決方案。 XDomainRequest不具有相同的屬性和回調,例如您需要實現onload而不是onreadystatechange,並且需要使用不同的回調來檢查錯誤。只要stackoverflow允許我回答我自己的問題,我會盡快發佈代碼。 – starbugs 2012-04-24 14:10:57