Intereting Posts
Добавление задач в планировщик Windows с помощью PHP Каким образом лучше всего использовать хэш-пароль? Получить последние рекурсивные файлы с помощью PHP Проверка наличия массива в многомерном массиве – отсутствие цикла – неизвестная глубина цикл wordpress, применяя что-то новое каждый третий пост как показать результаты, пока скрипт php все еще запущен url закодированные косые черты, нарушающие мое приложение codeigniter как установить драйвер php mongodb на windows 8 и wamp server? Не удалось удалить index.php в WAMP с URL-адресом Codeigniter установка cakephp 3 вручную, без композитора Как вы применяете htmlentities выборочно? Элементы упорядочиваются одинаково после разделения массива на array_keys () и array_values ​​()? Как получить доступ к пользовательскому атрибуту изображения в list.phtml в Magento PHP: проверьте, пустые ли какие-либо опубликованные vars – форма: все поля обязательны для заполнения Преобразование многомерных объектов в массив

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)); } 

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

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

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

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

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

Наилучшая практика, о которой вы говорите, касается сценария сервера, устанавливающего Content-Type для JSON на «application / json»:

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

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

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

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

Поэтому вам либо нужно:

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

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

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

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