Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Кроссдоменный запрос AJAX


Автор: Aleskert 11.4.2012, 20:41
Есть сайт, который содержит БД по одной из ММО игрушек.
На сайте красиво рисуются графики в Google Charts.
Цель: хочу себе такие же
Но есть проблема, я не могу сделать кросс-платформенный запрос. 
http://api.jquery.com/jQuery.ajax/ говорит, что просто доставь в параметрах 
Код

crossDomain: true

и будет щастье. Но увы и ах.

Сам запрос я реализировал так:
Код

var JSon = $.ajax({
url: 'http://worldofclans.ru/google_chart/ClanFights.html?id=99',
type: 'GET',
dataType:"json",
crossDomain: true,
async: false,
   success:function(){
      alert("Success");
   },
    error:function(){
       alert("Error");
   }
}).responseText;


Постоянно вылетает ошибка алертом.
Кто-то может помочь?

Автор: baldina 11.4.2012, 21:02
Цитата(Aleskert @  11.4.2012,  20:41 Найти цитируемый пост)
кросс-платформенный

и
Цитата(Aleskert @  11.4.2012,  20:41 Найти цитируемый пост)
crossDomain

это тёплое с мягким  smile 
Вам, конечно, нужен cross domain request
а кросс-платформенный ajax (т.е. независимый от браузера) обеспечивает jquery

документация jquery абсолютно права, Вы просто невнимательно читали. crossDomain - для эмуляции кросс-доменного запроса на своём сервере

Цитата(Aleskert @  11.4.2012,  20:41 Найти цитируемый пост)
dataType:"json",

а для запросов за пределами домена требуется тип jsonp
Код

dataType:"jsonp"



Автор: Aleskert 11.4.2012, 23:58
Страница из которой я пытаюсь вытянуть строку JSON не поддерживает callback (а значит и JSONP).
Она просто формирует некоторый данные раз в сутки. И именно эти данные надо вытянуть. Очень жаль, что я не знаком с регулярными выражениями, может они смогут помочь?

Добавлено через 14 минут и 19 секунд
Попытался сделать с помощью PHP таким образом:
Код

<?php
// Set your return content type
header('Content-type: text');

// Website url to open
$daurl = 'http://worldofclans.ru/google_chart/ClanFights.html?id=99';

// Get that website's content
$handle = fopen($daurl, "r");

// If there is something, read and return
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        echo $buffer;
    }
    fclose($handle);
}
?>


В этом моменте страница возвращает валидный JSON.
Но $.ajax почему-то его не кушает:
Код

var JSon = $.ajax({
url: 'http://localhost/demo/proxy.php', //страница на которая ловит чужой JSON
dataType:"json",
async: false,
   success:function(){
      alert("Success");
   },
    error:function(){
       alert("Error");
   }
}).responseText;

Автор: Aliance 12.4.2012, 10:00
Цитата(Aleskert @  12.4.2012,  00:58 Найти цитируемый пост)
В этом моменте страница возвращает валидный JSON.

Что-то я не заметил там работы с json вообще. там идет работа лишь с файлами.

Автор: Aleskert 12.4.2012, 14:44
Спасибо, исправил ошибку. Но появилась новая проблема smile
Код

<?php
// Set your return content type
header('Content-type: json; charset=utf-8');

// Website url to open
$daurl = 'http://worldofclans.ru/google_chart/ClanFights.html?id=99';

// Get that website's content
$handle = fopen($daurl, "r");

// If there is something, read and return
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        $old = array("{\"status\":{\"http_code\":200},\"contents\":\"", "\\ufeff", "\"date\"", "\"string\"", "\"\u041a\u043e\u043b-\u0432\u043e \u0431\u043e\u0435\u0432\"", "\"number\"", "\"");
        $new   = array("", "", "'date'", "'string'", "'Кол-во боев'", "'number'", "");
        $buffer = str_replace($old, $new, $buffer);
        echo json_encode($buffer);
    }
    fclose($handle);
}
?>


В самом начале строки появляется BOM, который не дает $.ajax получить свой профит.
Все файлы сохранены в "utf-8 без BOM", откуда он берется - ума не приложу.

Автор: baldina 12.4.2012, 15:56
Цитата(Aleskert @  12.4.2012,  14:44 Найти цитируемый пост)
откуда он берется - ума не приложу

сам php файл случаем не utf с BOM?

Добавлено через 10 минут и 11 секунд
вообще-то http://worldofclans.ru/google_chart/ClanFights.html?id=99 отдает utf c BOM.
php BOM не выкидывает, так что вот

Автор: Aliance 13.4.2012, 10:13
Всё-таки не
Код
header('Content-type: json; charset=utf-8');

а
Код
header('Content-type: application/json; charset=utf-8');


Да и функцию fopen для удалённого соединения идеалогически не правильно использовать. Лучше сокеты/cURL.

Автор: baldina 13.4.2012, 10:26
Цитата(Aliance @  13.4.2012,  10:13 Найти цитируемый пост)
Да и функцию fopen для удалённого соединения идеалогически не правильно использовать.

а file_get_contents()?
а что идеологически неправильного? (всё есть файл...)

Автор: Aliance 13.4.2012, 11:01
Цитата(baldina @  13.4.2012,  11:26 Найти цитируемый пост)
а file_get_contents()?

Я словом "сокеты" слишком грубо описал и в том числе эту функцию (все-таки она использует контекст через stream_context_create).
Я вообще приверженец курла, но почему бы и не так.

Что касается fopen, то вот http://forum.vingrad.ru/forum/topic-131851.html обсуждалась эта тема, почитай комментарии.

Автор: baldina 13.4.2012, 14:23
почитал. они не кажутся мне убедительными. в том смысле, что нет причин отказываться от этих функций всегда. разработчики php реализовали удобную модель fopen-wrapper (которая к передаче по сети отношения не имеет), почему её не использовать там, где допустимо?

Цитата(Aliance @  13.4.2012,  11:01 Найти цитируемый пост)
все-таки она использует контекст через stream_context_create

я не увидел различий в открытии файла
fopen()
Код

context = php_stream_context_from_zval(zcontext, 0);
stream = php_stream_open_wrapper_ex(filename, mode, (use_include_path ? USE_PATH : 0) | REPORT_ERRORS, NULL, context);
file_get_contents
Код

context = php_stream_context_from_zval(zcontext, 0);
stream = php_stream_open_wrapper_ex(filename, "rb", (use_include_path ? USE_PATH : 0) | REPORT_ERRORS, NULL, context);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)