Итак, по сути, у меня есть этот Javascript, который интерпретирует JSON из моего php-кода. Он отлично работает на локальном сервере, однако, когда я пытаюсь переместить скрипт на другой сервер, он не будет работать. Я добавил
<?php header("Access-Control-Allow-Origin: *"); ?>
также я объявил мое подключение к базе данных как глобальное в моей PHP-функции.
Я смущен, почему эти решения не работают. Кроме того, я понимаю, что некоторые из скриптов – это правда, но мне интересно только выяснить, почему он не работает с разных серверов.
<script type="text/javascript"> $("document").ready(function(){ $(".sendText").submit(function(){ $("#sendButton").prop("disabled",true); $(".errors").html(""); $(".success").html(""); var data = { "action": "test" }; data = $(this).serialize() + "&" + $.param(data); $.ajax({ type: "POST", dataType: "jsonp", //new edit url: "http://myurl.com/testing/jsonpost.php?callback=test", //new edit data: data, success: function(data) { if(data["success"]=="yes") { $(".success").html("Message Sent!"); $(".formContainer").html("" + data["json"] + ""); } else { if(document.getElementById("sendButton").disabled = true){ document.getElementById("sendButton").disabled = false; } $(".errors").html("" + data["errors"] + ""); } } }); return false; }); }); </script>
Отправить<script type="text/javascript"> $("document").ready(function(){ $(".sendText").submit(function(){ $("#sendButton").prop("disabled",true); $(".errors").html(""); $(".success").html(""); var data = { "action": "test" }; data = $(this).serialize() + "&" + $.param(data); $.ajax({ type: "POST", dataType: "jsonp", //new edit url: "http://myurl.com/testing/jsonpost.php?callback=test", //new edit data: data, success: function(data) { if(data["success"]=="yes") { $(".success").html("Message Sent!"); $(".formContainer").html("" + data["json"] + ""); } else { if(document.getElementById("sendButton").disabled = true){ document.getElementById("sendButton").disabled = false; } $(".errors").html("" + data["errors"] + ""); } } }); return false; }); }); </script>
Некоторая информация, когда я смотрю на веб-консоль от firebug:
Access-Control-Allow-Orig... * Connection Keep-Alive Content-Length 0 Content-Type application/json Date Wed, 24 Sep 2014 04:22:57 GMT Keep-Alive timeout=5, max=100 Server Apache/2.2.27 (Unix) mod_ssl/2.2.27 OpenSSL/1.0.1e-fips DAV/2 mod_bwlimited/1.4 X-Powered-By PHP/5.4.29
Похоже, что он общается с сервером, но не способен интерпретировать данные? мысли?
Кроме того, эта ошибка возникает в консоли с удаленного сервера, но не при запуске на локальном сервере:
SyntaxError {stack: (...), message: "Unexpected end of input"}message: "Unexpected end of input"stack: (...) Object {readyState: 4, getResponseHeader: function, getAllResponseHeaders: function, setRequestHeader: function, overrideMimeType: function… parsererror
PHP-код довольно длинный (и я предпочитаю не выпускать его все), но вот сокращенная версия:
<?php header("Access-Control-Allow-Origin: *"); header('Content-Type: application/json'); require "../database/db.php"; if (is_ajax()) { if (isset($_POST["action"]) && !empty($_POST["action"])) { //Checks if action value exists $action = $_POST["action"]; switch($action) { //Switch case for value of action case "test": test_function(); break; } } } //Function to check if the request is an AJAX request function is_ajax() { return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'; } function test_function(){ $c="1"; global $con; $return = $_POST; //to reference post $content=$return["content"]; //see if content is 140 characters or less if(strlen($content)>140){ $c="0"; $lerror="<li>Your message must be 140 characters or less in length!</li>"; } if($c=="0"){ //doesnt pass validation $return["success"]="no"; $return["errors"]="$lerror"; } if($c!="0"){ //passes validation $return["success"]="yes"; } if(isset($_GET['callback'])){ //jsonp edit $return["json"] = json_encode($return); echo $_GET['callback']."(".json_encode($return).")"; //jsonp edit } }
Также после преобразования в JSONP на удаленном сервере – получите ошибку –
"jQuery111006159528985153884_1411663761720 was not called"
При работе с jQuery AJAX с использованием типа данных JSON любое уведомление, предупреждение или ошибка, создаваемые скриптом на стороне сервера, вызовут проблемы. Причина в том, что выведенные ошибки PHP ломают JSON-кодировку, ожидаемую jQuery.
Я подозреваю, что две среды не идентичны, возможно, другая версия PHP, отсутствие расширения PHP или разные настройки в файле php.ini.
Лучше всего использовать предоставленный jQuery AJAX обратный вызов ошибки для консольного журнала любых ошибок, позволяющих существенно устранить любые проблемы, возникающие при использовании сценария на стороне сервера.
!!! ИЗМЕНИТЬ 3 !!!
Код клиента
$.ajax({ type: "POST", dataType: "json", url: "http://myurl.com/jsonpost.php", data: data, success: function(response) { console.log(response); }, error: function(xhr, status, error) { console.log(xhr); console.log(status); console.log(error); } });
Код сервера
header("Access-Control-Allow-Origin: *"); header('Content-Type: application/json'); echo json_encode(array('success' => 'yes'));
Используя эту версию вашего костяного кода, я могу успешно выполнить запрос перекрестного домена и консоль зарегистрировать ответ. Если вы реализуете этот код и он по-прежнему не работает, есть что-то еще в игре на уровне сервера и / или сети.
Вы можете сделать AJAX-вызовы API-интерфейсу, он должен вернуть формат JSONP, а не только JSON, иначе вы можете получить ошибку. Это связано с той же политикой происхождения:
https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy .
Это обсуждение может быть полезно для понимания JSONP:
Может ли кто-нибудь объяснить, что такое JSONP, в условиях неспециалиста?
Однако одним из вариантов является отключение безопасности браузера Google Chrome, и тогда он будет работать. Но это не решение. Лучше использовать формат JSonP.