nastya97core
@nastya97core
Начинающий программист

Как отправить и получить данные (не formdata) XMLHttpRequest?

Здравствуйте. Если речь идёт о отправке формы, то я всегда использовала вот этот код (он работает, проблем нет):
function send(event, php){
console.log("Отправка запроса");
event.preventDefault ? event.preventDefault() : event.returnValue = false;
var req = new XMLHttpRequest();
req.open('POST', php, true);
req.onload = function() {
	if (req.status >= 200 && req.status < 400) {
	json = JSON.parse(this.response);
    	console.log(json);
        
    	// ЗДЕСЬ УКАЗЫВАЕМ ДЕЙСТВИЯ В СЛУЧАЕ УСПЕХА ИЛИ НЕУДАЧИ
    	if (json.result == "success") {
    		// Если сообщение отправлено
    		alert("Сообщение отправлено");
    	} else {
    		// Если произошла ошибка
    		alert("Ошибка. Сообщение не отправлено");
    	}
    // Если не удалось связаться с php файлом
    } else {alert("Ошибка сервера. Номер: "+req.status);}}; 

// Если не удалось отправить запрос. Стоит блок на хостинге
req.onerror = function() {alert("Ошибка отправки запроса");};
req.send(new FormData(event.target));
}


Теперь мне нужно отправить не форму, а передать данные первым аргументом. Я попыталась сделать вот так:
<div onclick="sendtoCart('malako','tocart.php')">В КОРЗИНУ</div>

// ajax
function sendtoCart(event, php){
var req = new XMLHttpRequest();
req.open('POST', php, true);
req.onload = function() {
	if (req.status >= 200 && req.status < 400) {
	json = this.response;
    console.log("json",json);
        
    // Если не удалось связаться с php файлом
    } else {alert("Ошибка сервера. Номер: "+req.status);}}; 

// Если не удалось отправить запрос. Стоит блок на хостинге
req.onerror = function() {alert("Ошибка отправки запроса");};
req.send(event);
}

А на сервере:
<?php 
echo json_encode($_POST);
?>


Но консоль передаёт мне вот такое: json []

Что я делаю не так?
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
@Mellorn
Чтобы заполнялся массив $_POST, вы должны отправлять данные либо в multipart/form-data, либо в application/x-www-form-urlencoded с правильным заголовком Content-Type соответственно.
При передаче объекта FormData автоматом используется правильный заголовок.
Если вы хотите использовать application/x-www-form-urlencoded, заголовок нужно установить вручную через xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'). А сами данные должны быть строкой в формате 'key1=value1&key2=value2'.

Это так, для общего понимания.

Конкретно в вашем случае, вы отправляете обычный text/plain. Соответственно, $_POST у вас пустой.
Для того, чтобы получить тело запроса (данные, которые вы отправляете), воспользуйтесь
file_get_contents('php://input');
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@zkrvndm
Боты, парсеры, расширения
Попробуйте так:
async function send() {
	
	// Создаем форму с произвольными данными:
	
	var formData = new FormData();
	formData.append('param1', 'Значение param1');
	formData.append('param2', 'Значение param2');
	formData.append('param3', 'Значение param3');
	
	// Совершаем POST-запрос в котором передаем ранее созданную форму с нашими данными:
	
	var result = await fetch('https://site.ru/test.php', { method: 'POST', body: formData });
	
	// Извлекаем из ответа текст:
	
	var response = await result.text();
	
	// Выводим ответ сервера в консоли:
	
	console.log("Ответ сервера:\n" + response);
	
	// Завершаем промис
	// ответом сервера:
	
	return response;
	
}

Замените целевой адрес на свой, вызовите функцию send() из консоли и посмотрите результат.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы