jQuery Ajax в разных портах

Мой php-файл, расположенный на порту 80 (порт по умолчанию), в то время как мой вызов ajax находится на порту 8080.

Мой index.html на порт 8080

$(document).ready(function(){ $.get("userCheck.php", {"username" : "lazy", "favcolor" : "FFFFFF" }, function(data){ alert("Data Loaded: " + data); }); 

Мой PHP

 $user = $_GET["username"]; if($user == "lazy") echo "SUCESS"; else echo "FAIL"; 

У меня googled abit, JSONP вышел в основном. Любая идея, как преобразовать его в JSONP?

Любой способ заставить его работать?

Реализация службы JSONP очень просто, вам нужен только параметр GET обратного вызова и в конце напечатать строку, содержащую эквивалент вызова функции, с данными JSON в качестве аргумента:

 $callback = $_GET["callback"]; $user = $_GET["username"]; if($user == "lazy") { $response = array("message" => "SUCESS"); } else { $response = array("message" => "FAIL"); } echo $callback . "(". json_encode($response) . ");"; 

Затем вы можете использовать его с jQuery $.getJSON :

 $.getJSON("jsonpTest.php?callback=?", { username: "lazy"}, function(json){ alert("JSON Data: " + json.message); // SUCCESS }); 

Вы можете попробовать создать полный URL-адрес с номером порта ( http://myserver:[port]/userCheck.php ), но он не будет работать . ( Такая же политика происхождения )

Выполнение запроса на другом порту не означает, что вы должны использовать JSONP, потому что любая хорошая структура JSONP блокирует это (или, по крайней мере, должно). Это не главная цель JSONP разрешить эти вещи, это только побочный эффект от реализации.

Но вы можете создать «фасад» PHP-скрипт на том же порту, что и index.html , который затем выполняет запрос на другой URL-адрес и возвращает значение. Таким образом, браузер не знает о реальном URL-адресе.

index.html (8080) <--> myAjaxFacade.php (8080) <--> userCheck.php (80)

Для этого вы можете использовать функцию http-post-fields , например.

Пример:

 $(document).ready(function(){ $.get("myAjaxFacade.php", {"username" : "lazy", "favcolor" : "FFFFFF", "realUrl": "http://serverwithdifferent:port/userCheck.php" }, function(data){ alert("Data Loaded: " + data); }); 

Затем в myAjaxFacade.php все остальные данные POST в $_POST['realUrl'] и верните ответ с этого URL-адреса.

вы не можете этого сделать из-за той же политики происхождения . Поскольку порт отличается от того же самого правила происхождения, он будет применяться и блокирует ваш вызов XHR.

Вам нужно будет использовать прокси-сервер, чтобы делать такие вещи, вы можете взглянуть на JsonP или создать собственный прокси-сервер с помощью curl или скопировать код на один и тот же порт.

Политика Same Origin (SOP) запрещает Javascript отправлять запросы на любой другой хост и порт, чем тот, с которого он был загружен.

Что нужно для работы над этим, это программа, работающая на том же хосте и порту, что и начало javascript, который отправляет запросы фактической службе. Программа, которая действует так, обычно называется прокси-сервером , поэтому необходим прокси-сервер JSONP .

Если ваш сервер работает с ruby / rails и sinatra , github.com/greenisus/jsonp-proxy будет минимальным решением. Решение для PHP, которое, как представляется, имеет много функций, будет benalman.com/projects/php-simple-proxy/ .

Для JSONP на PHP см. Пример здесь . Вы добавляете параметр «обратного вызова» к URL-адресу, определяющему имя функции для запуска, и в вашем PHP-коде обязательно выпустите JavaScript, который вызывает обратный вызов с данными. jQuery внедряет элемент сценария с вашим контентом – при его запуске он вызывает обратный вызов.

Рабочее решение может быть путем развертывания «HAProxy» или «socat». Они могут перенаправить запрос в другой порт.