Не удается получить данные публикации, отправленные из Vue через axios в PHP

разработчики Я запускаю локальный сервер Apache. Есть статические файлы Vue и папка «print» с каким-то скриптом. Я пытаюсь отправить http-запрос из Vue (через axios) в папку «распечатать».

Я пытался использовать vue-resource для отправки данных, но у меня была та же проблема.

Вот метод Vue:

postData: function() {
      const data = {
        firstName: "John",
        lastName: "Doe"
      };
      const config = {
        headers: {
          "Content-Type": "application/x-www-form-urlencoded"
        }
      };
      axios
        .post("/print", data, config)
        .then(function(response) {
          console.info(response);
        })
        .catch(function(error) {
          console.info(error);
        });
    }

Файл index.php из папки печати:

<?php
$postBody = file_get_contents("php://input");
$postBody = json_encode($postBody);
echo 'Post: ',$postBody, ' here';

Вот несколько скринов из вкладки сети (извините за качество) Я не уверен, почему devtools обрабатывает запрос как GET, но я использую POST

Не удается получить данные публикации, отправленные из Vue через axios в PHP

Когда я записываю ответ в консоль, он выглядит так. Здесь ответ на самом деле POST. Но данных по-прежнему нет. Не удается получить данные публикации, отправленные из Vue через axios в PHP

Вкладка предварительного просмотра выглядит так.

Не удается получить данные публикации, отправленные из Vue через axios в PHP

Запрос на самом деле достигает файла, но $postBody — это просто пустая строка. Я предполагаю, что проблема в том, что ("php://input") не получает никакого ввода. Когда echo count($_POST) 0 возвращается. Спасибо за любую помощь..

На вашем снимке экрана показан запрос GET к /print, но вы используете axios.post. Это не имеет смысла. Вы уверены, что используете свой метод postData для запуска запроса?

Phil 07.04.2019 07:11

Это странно. Да, postData точно используется. Когда я регистрирую ответ в консоли, он показывает, что этот метод на самом деле POST. Возможно проблема в devtools.

Адильхан Сатемиров 07.04.2019 07:38

Убедитесь, что ваша консоль Сеть открыта, затем активируйте postData. Вы должны увидеть запрос POST. Кроме того, что вызывает postData? Это случайно не <form> отправка?

Phil 07.04.2019 07:40
json_encode() в вашем PHP должно быть json_decode(). Смотрите мой ответ ниже
Phil 07.04.2019 07:47
<button @click = "postRequest()">post data</button> эта кнопка является триггером для postData. Я запускаю его, но на вкладке «Сеть» по-прежнему отображается запрос GET. В то время как функция обратного вызова показывает, что это POST, как на картинке.
Адильхан Сатемиров 07.04.2019 08:08

Это кнопка в форме? Если это так, см. примечание в моем ответе о добавлении модификатора события «.prevent».

Phil 07.04.2019 11:11

Большое спасибо @Phil. Очень странно, но проблема была в адресе каталога. Запрос GET был сделан при вводе /print. После смены на /print/index.php все заработало и был сделан POST запрос. @Phil, отредактируй ответ, добавив этот пункт, и я отмечу ответ как правильный. После ваших советов я многому научился. Будьте здоровы..

Адильхан Сатемиров 07.04.2019 13:13

Похоже на неправильную настройку веб-сервера. я обновил свой ответ

Phil 07.04.2019 13:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
8
628
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь есть пара проблем, которые я рассмотрю по порядку.

  1. Вы отправляете JSON, а не application/x-www-form-urlencoded, поэтому удалите этот Content-type заголовок запроса. Аксиос по умолчанию application/json
  2. Axios по умолчанию ожидает, что ответ будет JSON, но ваш PHP-скрипт отвечает простым текстом. Измените свой config на

    const config = {
      responseType: 'text'
    }
    
  3. Вы используете json_encode() там, где вы должны использовать json_decode(). Первый превращает структуру данных PHP в строку в формате JSON. Последний делает наоборот.
  4. По догадке, если вы используете что-то вроде

    <form @submit = "postData" action = "/print">
    

    тогда вам нужно изменить его на

    <form @submit.prevent = "postData">
    

    чтобы форма не отправлялась нормально. То же самое происходит, если вы используете кнопку отправки формы с обработчиком @click. Это или используйте type = "button", чтобы он не отправлялся по умолчанию.

    См. https://vuejs.org/v2/guide/events.html#Event-Modifiers

  5. Ваш веб-сервер может выполнять перенаправление с /print на /print/index.php, преобразовывая ваш запрос POST в GET. Чтобы этого не произошло, используйте полный путь в своем URL-адресе.

  6. Предполагая, что в вашем PHP все работает, $postBody будет экземпляром stdclass, результатом json_decode(). Попытка echo этого не сработает. На самом деле это будет вызвать ошибку вроде

    Recoverable fatal error: Object of class stdClass could not be converted to string

    но ваш уровень сообщения об ошибках может быть установлен неправильно, чтобы вы могли видеть. См. Как получить полезные сообщения об ошибках в PHP?

    Если вы просто хотите повторно показать JSON, попробуйте

    $postBody = json_decode(file_get_contents('php://input')); // returns a stdclass
    echo 'Post: ', json_encode($postBody), ' here';
    

    Обратите внимание, что ответ не будет действительным JSON из-за ваших выходных данных "Сообщение: " и " здесь".

Спасибо за ответ. Я установил error_reporting=E_ALL, но сообщение по-прежнему не отображается. Я предполагаю, что проблема в том, что просто ничего не приходит (php://input). Буду признателен за дальнейшие предложения :)

Адильхан Сатемиров 07.04.2019 06:49

@АдильханСатемиров проверьте консоль Сеть вашего браузера. Найдите запрос AJAX и проверьте заголовки и тело запроса. Разместите несколько скриншотов в своем вопросе

Phil 07.04.2019 06:50

@ АдильханСатемиров также, если вы хотите видеть ошибки в выводе PHP, вам нужно display_errors=On. Также не забудьте перезапустить Apache, если вы меняете php.ini

Phil 07.04.2019 06:51

Другие вопросы по теме