簡體   English   中英

有什么辦法可以從子域加載json嗎?

[英]Is there any way to load json from a subdomain?

我很樂意將一些.json文件存儲在CDN上的static.mydomain.com中。 說實話,static.mydomain.com是Amazon S3存儲桶前面的CNAME。

我了解這違反了JavaScript安全模型。 有建議的解決方法或設計嗎? 我已經看到服務器端的東西建議像一個PHP腳本來通過cURL或file_gets_contents()吸收數據,但這是一種la腳的方法。 有什么方法可以從外部服務器加載JSON而又不會太hacky?

===

更新:這是使我相信這是子域的跨域問題的思路。

當我在Chrome瀏覽器訪問某個頁面(例如static.mydomain.com/json/file.json)時,該頁面顯示為純文本。 當我在Firefox中訪問該頁面時,它試圖讓我將.json保存為下載文件。

我在Firebug中看到了一個奇怪的結果: 200響應 ,沒有響應主體。 替代文字

我無法通過瀏覽器記錄直接標頭; 在強制下載之前,我的Firefox HTTP標頭插件未記錄任何內容。 但是,以下是通過此jQuery代碼段加載時的標頭(值得注意的是,以下警報不會觸發):

jQuery.get("https://static.mydomain.com/json/file.json",
   function(data){
     alert("Data: " + data);
   }
);

響應標題

x-amz-id-2 wSVtjlvFj5ffOtg7ZbKqKw8PexqlzJic7+PxSk975/FcDUnshSV2CiUP2oPWR8yK
x-amz-request-id 8AD81565A783988D
Date Tue, 19 Oct 2010 00:07:22 GMT
Expires Sat, 17 Oct 2015 22:25:37 GMT
Last-Modified Mon, 18 Oct 2010 01:08:13 GMT
Etag "2f1c7adcc1a7b0fd8fc8ce1478e0bf81"
Content-Type application/json
Content-Length 85966
Server AmazonS3

請求標題

Host static.mydomain.com
User-Agent Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept application/json, text/javascript, */*; q=0.01
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 115
Connection keep-alive
Referer http://mydomain.com/directory/referrer.html
Origin http://mydomain.com

盡管在我看來標頭還不錯, 但是沒有任何對get,post或其他任何我可以通過jQuery拋出的響應的正文 將內容類型設置為application / json,text / javascript和text / plain時,我會看到相同的結果。

誰能解釋這種行為? 我認為我在S3方面一定做錯了什么,但是這可能是JavaScript中的跨域問題,還是可以排除跨子域問題?

使用jQuery.getJSON而不是.get。 .get使用XHR,該XHR在各個域(甚至子域)之間也不友好。 getJSON使用將起作用的JSONP請求。

http://api.jquery.com/jQuery.getJSON/

不過,您需要為JSONP響應修改JSON數據。 它采用定義回調的參數。 jQuery創建了一個隨機函數作為回調,因此,如果您要把它用作CDN,您將無法在響應中動態更改回調名稱。

您可以通過將正確的參數傳遞給jQuery.ajax來使用靜態回調: http : //api.jquery.com/jQuery.ajax/

dataType: 'json' //(.getJSON is just a shorthand for .ajax with this paraeter set)
jsonpCallback: 'myStaticCallbackName' // Lets the client know what callback to expect from the server.

然后您的響應應如下所示:

myStaticCallbackName({"foo": "bar"});

您可以使用JSONP或使用到子域的絕對路徑(假定子域位於同一服務器上,並且必須在同一服務器上)。 也就是說,您可以使用/ home / path_to_subdomain /等,而不是https:等等。

JSONP也是一個很好的解決方案,但是如果您僅可以提供子域的絕對路徑,則可能會過大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM