Javascript — Получить JSON AJAX PHP форму для удаленной работы

Итак, по сути, у меня есть этот 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>

Немного информации, когда я смотрю на веб-консоль из 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"

1

Решение

При работе с 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'));

Используя эту версию вашего кода, я могу успешно сделать междоменный запрос и консоль записать ответ. Если вы реализуете этот код, и он все еще не работает, то на уровне сервера и / или сети действует что-то еще.

1

Другие решения

Вы можете делать AJAX-вызовы к бэкэнд-API, он должен возвращать формат JSONP, а не только JSON, иначе вы можете получить ошибку. Это связано с той же политикой происхождения:

https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy.

Это обсуждение может быть полезно для понимания JSONP:

Кто-нибудь может объяснить, что такое JSONP, с точки зрения непрофессионала?

Однако один из вариантов — отключить безопасность браузера Google Chrome, тогда он будет работать. Но это не решение. Лучше использовать формат JSonP.

0

По вопросам рекламы [email protected]