it-swarm.com.ru

Ajax-вызов с contentType: "application/json" не работает

У меня есть вызов ajax, который отправляет данные формы в функцию php. Поскольку я много читал о том, что использование contentType: 'application/json' - лучшая практика, я тоже хотел попробовать. Но, к сожалению, мой скрипт ничего не возвращает, когда я его использую. Если я удаляю его, скрипт делает то, что должен. 

Ты хоть представляешь, в чем причина и почему? Спасибо!

$('#Form').submit(function(e) {
            e.preventDefault();

            var content = $(this).serialize() + "&ajax=1";

            $.ajax('app/class/controller/contactForm.php', {
              type: "POST",
              //contentType: 'application/json',
              dataType: 'json',
              data: content,
              success: function(result) {
                  console.log(result);
              }
            });
        })

и мой PHP:

if(isset($_POST['ajax']) && $_POST['ajax'] === '1') {
    echo json_encode(validateForm($_POST));
}
11
Sebsemillia

При использовании contentType: 'application/json' вы не сможете рассчитывать на заполнение $_POST. $_POST заполняется только для типов контента с закодированной формой.

Таким образом, вам нужно прочитать данные из PHP необработанного ввода следующим образом:

$input = file_get_contents('php://input');
$object = json_decode($input);

Конечно, если вы хотите отправить application/json, вы должны отправить JSON, чего вы не делаете. Вам нужно либо создать сериализацию объекта непосредственно в JSON, либо сделать что-то вроде этого - Преобразовать данные формы в объект JavaScript с помощью jQuery - для сериализации объекта из формы.

Честно говоря, в вашем случае, поскольку вы имеете дело с данными формы, я не совсем думаю, что есть вариант использования application/json.

18
Mike Brant

Наилучшая практика, на которую вы ссылаетесь, заключается в том, чтобы серверный скрипт устанавливал Content-Type для JSON в "application/json":

Header('Content-Type: application/json; charset=UTF8');

Это связано с тем, что в противном случае будет отправлено Content-Type по умолчанию, часто это универсальный text/html, и это может привести к непониманию с клиентом.

Если вы не задаете себе Content-Type в запросе jQuery, jQuery определит наиболее подходящий. Проблема здесь в том, что вы отправляли POST форму, для которой Content-Type по умолчанию, установленный с помощью jQuery , это application/x-www-form-urlencoded, который говорит PHP декодировать данные как POST и заполните $_POST. Ваш скрипт затем восстановил бы свои параметры из $_POST (или, возможно, $_REQUEST).

При изменении его на application/json, $_POST больше не будет заполняться, операция получения сценария не получит параметры, которые она ожидала, и операция прервется.

Так что вам либо нужно:

  • не указывайте Content-Type самостоятельно (лучше, ИМХО)
  • установить тип содержимого application/x-www-form-urlencoded; charset=UTF-8
  • установите Content-Type application/json; charset=UTF-8 и измените скрипт для анализа потока POST и декодирования данных JSON; см. этот ответ .

Третий вариант требует правильной обработкиphp://input.

3
LSerni

Сценарий PHP должен устанавливать заголовок Content-Type.

if(isset($_POST['ajax']) && $_POST['ajax'] === '1') {
    header('Content-Type: application/json');
    echo json_encode(validateForm($_POST));
}
1
ceejayoz