Задать вопрос

Как отправить JSON на PHP через POST?

С недавнего времени решил переходить на нативный JS и столкнулся с проблемой передачи данных через AJAX. Задача стоит следующая: имеем некий объект который надо передать на сервер.

Код на JS
var someObj = {a:1,b:2};
var xhr = new XMLHttpRequest();
xhr.open('POST', 'node.php', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(someObj);
xhr.onreadystatechange = function(){
	if (this.readyState == 4) {
		if (this.status == 200)
			console.log(xhr.responseText);
		else
			console.log('ajax error');
	}
};


Аналогичный код на jQuery
var someObj = {a:1,b:2};
$.ajax({
	type: "POST",
	url: "node.php",
	data: someObj,
	success: function(res) {
		console.log(res);
	}
});


Принимаем данные на PHP
print_r($_REQUEST);

В результате имеем не рабочий код на нативном JS и рабочий код на jQuery. В первом случае (JS) всегда возвращает в консоль:
Array
(
)

Во втором (jQuery):
Array
(
    [a] => 1
    [b] => 2
)


Как бы я не пытал свой JS, он ничего возвращать не хочет. Подскажите в чем может быть проблема или хотябы в какую сторону мне смотреть?
  • Вопрос задан
  • 18380 просмотров
Подписаться 1 Оценить 4 комментария
Решения вопроса 1
@OVK2015
Как-то так:
js:
var someObj = {a:1,b:2};
var xhr = new XMLHttpRequest();			
xhr.open('POST', 'scratch.php');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');			
xhr.send('param=' + JSON.stringify(someObj));
xhr.onreadystatechange = function()
{
	if (this.readyState == 4) 
	{
		if (this.status == 200)
		{
			console.log(xhr.responseText);
		}
		else
		{
			console.log('ajax error');
		}
	}
};


php:
$param = json_decode($_REQUEST["param"]);
$result = "Результат: a = ".$param->a."; b = ".$param->b;
die($result);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Sanasol
@Sanasol Куратор тега JavaScript
нельзя просто так взять и загуглить ошибку
jquery раскладывает json в обычный post запрос: key=value&ke2=value2
А вы просто объект отправляете в нативном варианте, а туда надо отправлять строку как выше или же JSON сформированную строку(на php через php//input разбирать).
Ответ написан
Rou1997
@Rou1997
Нужен Fiddler, Wireshark и т.п. для анализа (отладки) запросов, сравнили бы, поняли в чем проблема.
Ответ написан
Комментировать
VGrabko
@VGrabko
Golang, Php, Js
var str = "";
for (var key in someObj) {
    if (str != "") {
        str += "&";
    }
    str += key + "=" + encodeURIComponent(someObj[key]);
}
xhr.send(str);
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы