У меня есть вызов 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
больше не будет заполняться, операция получающего скрипта не получит параметры, в которых он ожидал, и операция прерывается.
Поэтому вам либо нужно:
application/x-www-form-urlencoded; charset=UTF-8
application/x-www-form-urlencoded; charset=UTF-8
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)); }