#jquery #ajax #symfony4
#jquery #ajax #symfony4
Вопрос:
Мне потребовалось некоторое время, чтобы понять, как получить данные в Symfony 4 с помощью jQuery Ajax POST запроса. Я помещу код, который может кому-то помочь, но он поднимает 2 вопроса, на которые я пока не могу найти ответа. Вот код:
Javascript:
function sendData() {
$.ajax({
url: 'response2',
method: 'POST',
processData: false,
contentType: "application/json; charset=utf-8",
data: JSON.stringify({ "name": "John", "time": "2pm" }),
dataType: "json",
success: function (data) {
console.log(data);
}
});
}
PHP (в контроллере Symfony)
/**
* @Route("/response2", name="test_response2")
* @param Request $request
* @return Response
*/
public function response2 (Request $request) : Response
{
$data1 = $request->getContent();
$data2 = json_decode($data1);
return $this->json(['data1' => $data1, 'data2' => $data2, 'data3' => $data2->name]);
}
и результат, как и ожидалось, и все работает нормально
{data1: "{"name":"John","time":"2pm"}", data2: {name: "John", time: "2pm"}, data3: "John"}
Однако я все еще чего-то не понимаю. Если я выполняю очень простой Ajax-запрос, например, так:
function sendData() {
$.ajax({
url: 'response2',
method: 'POST',
data: { "name": "John", "time": "2pm" },
success: function (data) {
console.log(data);
}
});
}
Даже если это POST-запрос, я заметил в профилировщике Symfony, что данные отображаются не в разделе «Параметры публикации», как я ожидал, а в разделе «Содержимое запроса» в виде необработанных данных.
Также я обнаружил, что заголовок содержит 2 ссылки на тип Content-Type : Content-Type: text/plain;charset=UTF-8
и Content-Types: application/json; charset=utf-8
. Я не смог найти никакой информации о типах контента
Итак, мои вопросы:
- почему и как данные ajax обнаруживаются как необработанные данные в Symfony, а не как данные POST?
- что означает Content-Type S, в чем он отличается от Content-Type?
Заранее спасибо
Комментарии:
1. jQuery не преобразует объекты в строки json, вместо этого он преобразует их в строки параметров.
Ответ №1:
Ответ содержится в документе, который я неверно истолковал…
Когда данные являются объектом, jQuery генерирует строку данных из пар ключ / значение объекта, если для параметра ProcessData не установлено значение false. Документация
Поэтому, даже если запрос является POST-запросом, профилировщик Symfony не знает данные как обычные POST-параметры, поэтому он не может найти их в запросе, чтобы показать их в разделе «Параметры публикации» и вместо этого отобразить в разделе «Содержимое запроса».