Есть ли способ загрузить JSON из поддомен? - PullRequest
7 голосов
/ 19 октября 2010

Я бы хотел сохранить некоторые файлы .json на CDN в виде static.mydomain.com. По правде говоря, static.mydomain.com - это CNAME перед корзиной Amazon S3.

Я понимаю, что это нарушает модель безопасности JavaScript. Есть ли советуемое решение или дизайн? Я видел такие вещи на стороне сервера, которые были предложены, например, PHP-скрипт для отсоса данных с помощью cURL или file_gets_contents (), но это довольно неудачный подход. Есть ли способ загрузить JSON с чужого сервера, не слишком хакерский?

===

ОБНОВЛЕНИЕ: Вот линия мысли, которая привела меня к мысли, что это проблема междоменных доменов для поддоменов.

Когда я захожу на страницу (например, static.mydomain.com/json/file.json) в Chrome, она отображается в виде обычного текста. Когда я захожу на страницу в Firefox, она пытается заставить меня сохранить файл .json для загрузки.

Я вижу странный результат в Firebug: 200 ответ без тела ответа. alt text

Я не могу записать прямые заголовки через браузер; мой плагин HTTP-заголовка Firefox ничего не регистрирует до принудительной загрузки. Однако вот заголовки при загрузке через этот фрагмент 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 или я могу исключить междоменные проблемы?

Ответы [ 2 ]

4 голосов
/ 19 октября 2010

Используйте jQuery.getJSON вместо .get..get использует XHR, который не подходит для разных доменов (даже поддоменов).getJSON использует JSONP-запрос, который будет работать.

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

Однако вам потребуется изменить данные JSON для ответа JSONP.Он принимает параметр, который определяет обратный вызов.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"});
2 голосов
/ 19 октября 2010

Вы можете использовать JSONP или использовать абсолютный путь к поддомену (это предполагает, что поддомен находится на том же сервере, каким он и должен быть).То есть вместо https: бла-бла, вы должны использовать / home / path_to_subdomain / etc.путь к поддомену.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...