jQuery Ajax POST запрос в профилировщике Symfony 4

#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 . Я не смог найти никакой информации о типах контента

Итак, мои вопросы:

  1. почему и как данные ajax обнаруживаются как необработанные данные в Symfony, а не как данные POST?
  2. что означает Content-Type S, в чем он отличается от Content-Type?

Заранее спасибо

Комментарии:

1. jQuery не преобразует объекты в строки json, вместо этого он преобразует их в строки параметров.

Ответ №1:

Ответ содержится в документе, который я неверно истолковал…

Когда данные являются объектом, jQuery генерирует строку данных из пар ключ / значение объекта, если для параметра ProcessData не установлено значение false. Документация

Поэтому, даже если запрос является POST-запросом, профилировщик Symfony не знает данные как обычные POST-параметры, поэтому он не может найти их в запросе, чтобы показать их в разделе «Параметры публикации» и вместо этого отобразить в разделе «Содержимое запроса».