разработчики Я запускаю локальный сервер 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
Когда я записываю ответ в консоль, он выглядит так. Здесь ответ на самом деле POST. Но данных по-прежнему нет.
Вкладка предварительного просмотра выглядит так.
Запрос на самом деле достигает файла, но $postBody
— это просто пустая строка. Я предполагаю, что проблема в том, что ("php://input")
не получает никакого ввода. Когда echo count($_POST)
0 возвращается. Спасибо за любую помощь..
Это странно. Да, postData точно используется. Когда я регистрирую ответ в консоли, он показывает, что этот метод на самом деле POST. Возможно проблема в devtools.
Убедитесь, что ваша консоль Сеть открыта, затем активируйте postData
. Вы должны увидеть запрос POST. Кроме того, что вызывает postData
? Это случайно не <form>
отправка?
json_encode()
в вашем PHP должно быть json_decode()
. Смотрите мой ответ ниже
<button @click = "postRequest()">post data</button>
эта кнопка является триггером для postData. Я запускаю его, но на вкладке «Сеть» по-прежнему отображается запрос GET. В то время как функция обратного вызова показывает, что это POST, как на картинке.
Это кнопка в форме? Если это так, см. примечание в моем ответе о добавлении модификатора события «.prevent».
Большое спасибо @Phil. Очень странно, но проблема была в адресе каталога. Запрос GET был сделан при вводе /print
. После смены на /print/index.php
все заработало и был сделан POST запрос. @Phil, отредактируй ответ, добавив этот пункт, и я отмечу ответ как правильный. После ваших советов я многому научился. Будьте здоровы..
Похоже на неправильную настройку веб-сервера. я обновил свой ответ
Здесь есть пара проблем, которые я рассмотрю по порядку.
application/x-www-form-urlencoded
, поэтому удалите этот Content-type
заголовок запроса. Аксиос по умолчанию application/json
Axios по умолчанию ожидает, что ответ будет JSON, но ваш PHP-скрипт отвечает простым текстом. Измените свой config
на
const config = {
responseType: 'text'
}
json_encode()
там, где вы должны использовать json_decode()
. Первый превращает структуру данных PHP в строку в формате JSON. Последний делает наоборот.По догадке, если вы используете что-то вроде
<form @submit = "postData" action = "/print">
тогда вам нужно изменить его на
<form @submit.prevent = "postData">
чтобы форма не отправлялась нормально. То же самое происходит, если вы используете кнопку отправки формы с обработчиком @click
. Это или используйте type = "button"
, чтобы он не отправлялся по умолчанию.
Ваш веб-сервер может выполнять перенаправление с /print
на /print/index.php
, преобразовывая ваш запрос POST
в GET
. Чтобы этого не произошло, используйте полный путь в своем URL-адресе.
Предполагая, что в вашем 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)
. Буду признателен за дальнейшие предложения :)
@АдильханСатемиров проверьте консоль Сеть вашего браузера. Найдите запрос AJAX и проверьте заголовки и тело запроса. Разместите несколько скриншотов в своем вопросе
@ АдильханСатемиров также, если вы хотите видеть ошибки в выводе PHP, вам нужно display_errors=On
. Также не забудьте перезапустить Apache, если вы меняете php.ini
На вашем снимке экрана показан запрос GET к
/print
, но вы используетеaxios.post
. Это не имеет смысла. Вы уверены, что используете свой методpostData
для запуска запроса?