Не могу получить данные из POST Ajax

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
guru_nemo
Сообщения: 64
Зарегистрирован: 2017.04.10, 21:28

Не могу получить данные из POST Ajax

Сообщение guru_nemo » 2017.04.10, 21:43

Проблема в следующем. Отправляю ajax запрос не из формы а функцией $.ajax({ }) если это делаю GET, то всё работает. Но как только меняю на POST, сразу жопа.
Перерыл весь инет. Пробовал отправлять csrfToken в запросе data: {'id': '2', csrfParam : csrfToken} не помогло.
Работает следующим образом. Когда в action я пишу $data = $request->post(); и потом пробую обратиться к $data вылетает какая-то ошибка. Если без этого, то любой код работает и даже отправляется ответ.
Проверка ($request->isPost && $request->isAjax) проходит.
Пришёл к выводу, что не могу почему-то получить данные из post. Кто-нибудь сталкивался с такой проблемой.

caHek2x
Сообщения: 1226
Зарегистрирован: 2016.04.12, 20:41

Re: Не могу получить данные из POST Ajax

Сообщение caHek2x » 2017.04.10, 22:17

"какаято ошибка" ... какая ?
что в дебаге пишет - что пришло ?

guru_nemo
Сообщения: 64
Зарегистрирован: 2017.04.10, 21:28

Re: Не могу получить данные из POST Ajax

Сообщение guru_nemo » 2017.04.11, 05:39

"58ec33be4363f";
s:3:"url";
s:41:"http://backend.yii.mini/admin/ajax/delete";
s:4:"ajax";
i:1;
s:6:"method";
s:4:"POST";
s:2:"ip";
s:9:"127.0.0.1";
s:4:"time";
i:1491874750;
s:10:"statusCode";
i:200;
s:8:"sqlCount";
i:0;
s:9:"mailCount";
i:0;

код action:
public function actionDelete()
{
$request = Yii::$app->request;
if ($request->isPost && $request->isAjax)
{
$data = $request->post();
$path = Yii::getAlias("@backend/public/img/1.txt");
$file = fopen($path,"w");
fwrite($file,var_dump($data));
fclose($file);
//$mySaveId = $data['id'];
echo '89';
}
}

код js:
function send_data(ajax_url, method)
{
var csrfParam = $('meta[name="csrf-param"]').attr("content");
var csrfToken = $('meta[name="csrf-token"]').attr("content");
$.ajax({
type: method,
url: ajax_url,
data: {'id': '2', csrfParam : csrfToken},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
//do something
alert(data);
},
error: function (errormessage) {
//do something else
alert("not working");
}
});
}

работает это так. если отправляю запрос, то после var_dump($data) код вылетает(так как не приходит '89' из echo), и срабатывает alert("not working"). Если убрать var_dump($data) и заменить его значением, то в ответе приходит '89' из echo.

someweb
Сообщения: 545
Зарегистрирован: 2017.03.09, 10:12

Re: Не могу получить данные из POST Ajax

Сообщение someweb » 2017.04.11, 08:45

F12 в браузере, откройте вкладку сеть и посмотрите, что возвращается в ответ на запрос ajax.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

guru_nemo
Сообщения: 64
Зарегистрирован: 2017.04.10, 21:28

Re: Не могу получить данные из POST Ajax

Сообщение guru_nemo » 2017.04.11, 10:14

ответ 200OK Content-Length:"16", но это ошибка, так как срабатывает function (errormessage) {alert("not working");} как просмотреть errormessage?

caHek2x
Сообщения: 1226
Зарегистрирован: 2016.04.12, 20:41

Re: Не могу получить данные из POST Ajax

Сообщение caHek2x » 2017.04.11, 11:50

во первых пользуйтесь тег code когда копируете код на форум ...
во вторых я уже сказал вам про дебаг ... почему вы туда не зашли ... если бы зашли увидели картину чтото типа: https://yadi.sk/d/52dJs-rsvKBDE и сразу стало бы ясно многое ... плюс там же и ошибку вы бы скопировали ...
в третьих fwrite($file,var_dump($data));
что это за конструкция ? var_dump не возвращает результат в виде строки чтоб его кудато передавать ...
print_r умеет такое делать если передать второй параметр true ...

guru_nemo
Сообщения: 64
Зарегистрирован: 2017.04.10, 21:28

Re: Не могу получить данные из POST Ajax

Сообщение guru_nemo » 2017.04.11, 12:37

Request Body:
Content Type 'application/json; charset=utf-8'
Raw 'id=4&_csrf_backend=QVpiblBDbmUnOzcXNjYkHzMKGzgmej0RLhQuFzINAz92AihXEQ0XUA%3D%3D'

статус 200.
т.е. данные уходят в посте.
а ответ сервера в дебаг где искать?

fwrite($file,var_dump($data)); пишет в файл результат var_dump($data), а не возвращает результат.

Аватара пользователя
Alexum
Сообщения: 675
Зарегистрирован: 2016.09.26, 10:00

Re: Не могу получить данные из POST Ajax

Сообщение Alexum » 2017.04.11, 12:53

У вас в панели дебага должна быть кнопка "AJAX[счётчик запросов]". Кликаете на неё, появляется список ваших ajax-запросов. В них можно кликнуть по ID дебага и откроется информация по этому запросу. В разделе Request смотрите какие данные в $_POST.

caHek2x
Сообщения: 1226
Зарегистрирован: 2016.04.12, 20:41

Re: Не могу получить данные из POST Ajax

Сообщение caHek2x » 2017.04.11, 12:53

guru_nemo писал(а):
2017.04.11, 12:37
а ответ сервера в дебаг где искать?
не ответ сервера ... а дебаг выполнения ...
вашсайт/debug/
guru_nemo писал(а):
2017.04.11, 12:37
fwrite($file,var_dump($data)); пишет в файл результат var_dump($data), а не возвращает результат.
вы издеваетесь ?
давайте по порядку ...
fwrite - принимает на вход два параметра
1 - это указатель на файл
2 - это записываемая строка

указатель на файл у вас в $file, все хорошо
но где же второй параметр, строка ? вы там пишите var_dump ... но var_dump не возвращает строку он выводит данные на экран ...
поэтому в файл у вас не пишется ...

теперь еще насчет
dataType: "json",
а вы не думаете после этого в контроллере прописать

Код: Выделить всё

Yii::$app->response->format = Response::FORMAT_JSON;
?

guru_nemo
Сообщения: 64
Зарегистрирован: 2017.04.10, 21:28

Re: Не могу получить данные из POST Ajax

Сообщение guru_nemo » 2017.04.11, 12:55

Alexum писал(а):
2017.04.11, 12:53
У вас в панели дебага должна быть кнопка "AJAX[счётчик запросов]". Кликаете на неё, появляется список ваших ajax-запросов. В них можно кликнуть по ID дебага и откроется информация по этому запросу. В разделе Request смотрите какие данные в $_POST.
Так я уже написал что уходит постом. Мне интересно, что приходит с сервера.

caHek2x
Сообщения: 1226
Зарегистрирован: 2016.04.12, 20:41

Re: Не могу получить данные из POST Ajax

Сообщение caHek2x » 2017.04.11, 12:57

guru_nemo писал(а):
2017.04.11, 12:55
Alexum писал(а):
2017.04.11, 12:53
У вас в панели дебага должна быть кнопка "AJAX[счётчик запросов]". Кликаете на неё, появляется список ваших ajax-запросов. В них можно кликнуть по ID дебага и откроется информация по этому запросу. В разделе Request смотрите какие данные в $_POST.
Так я уже написал что уходит постом. Мне интересно, что приходит с сервера.
как что, приходит результат вар дампа, т.к. он не в файл летит а на вывод ... и ваше echo ...
хотите var_dump поместить в строку

Код: Выделить всё

ob_start();
var_dump($data);
$str = ob_get_clean();

guru_nemo
Сообщения: 64
Зарегистрирован: 2017.04.10, 21:28

Re: Не могу получить данные из POST Ajax

Сообщение guru_nemo » 2017.04.11, 13:00

понятно, тут ещё те чайники. может кто более прошареный ответит?

Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Не могу получить данные из POST Ajax

Сообщение rugabarbo » 2017.04.11, 13:10

guru_nemo писал(а):
2017.04.10, 21:43
Проблема в следующем. Отправляю ajax запрос не из формы а функцией $.ajax({ }) если это делаю GET, то всё работает. Но как только меняю на POST, сразу жопа.
Перерыл весь инет. Пробовал отправлять csrfToken в запросе data: {'id': '2', csrfParam : csrfToken} не помогло.
Работает следующим образом. Когда в action я пишу $data = $request->post(); и потом пробую обратиться к $data вылетает какая-то ошибка.
Какая именно?

caHek2x
Сообщения: 1226
Зарегистрирован: 2016.04.12, 20:41

Re: Не могу получить данные из POST Ajax

Сообщение caHek2x » 2017.04.11, 13:12

уважаемый, я вам дал ответ, вы в нем не разобрались и решили что он не верный или в чем беда ?
вы до сих пор не поняли про var_dump ? http://php.net/manual/ru/function.var-dump.php почитайте, особенно про раздел возвращаемых значений ...
про json я вам написал(ошибки нет, у вас ответ не верный который ждет ajax ...), где находится дебаг я тоже написал ... что вы хотите чтоб вам еще ответили ?

sosnovskiy
Сообщения: 239
Зарегистрирован: 2017.03.28, 20:03

Re: Не могу получить данные из POST Ajax

Сообщение sosnovskiy » 2017.04.11, 15:38

Уважаемы caHek2x все верно подметил.
Однако ваша проблема с тем что вы не можете получить данные post запроса заключается в отсутствии json парсера для компонента request.
Пропишите в конфиге приложения что то типа:

Код: Выделить всё

'request' => [
            'cookieValidationKey' => 'ваш ValidationKey',
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ]
        ],

caHek2x
Сообщения: 1226
Зарегистрирован: 2016.04.12, 20:41

Re: Не могу получить данные из POST Ajax

Сообщение caHek2x » 2017.04.11, 16:52

к счастью то ли yii то ли jquery то ли просто php (даже не задумывался) но данные из поля data корректно преобразует в массив в запросе ... так что тут беды нет ) просто ajax ждет ответа json ... а ответ это набор текста: 1-е это то что выведет vardump (как писал выше он не в файл выведет он выведет в "вывод" то есть в ответ ...) и + echo ...

sosnovskiy
Сообщения: 239
Зарегистрирован: 2017.03.28, 20:03

Re: Не могу получить данные из POST Ajax

Сообщение sosnovskiy » 2017.04.11, 17:05

Не совсем понимаю как jquery может, как вы говорите, "данные из поля data корректно преобразует в массив" ...
Request компонент занимается преобразованием в массив данных из запроса. Однако по умолчанию парсер json не включен в компоненте.
Выдержка из phpDoc`а:

Код: Выделить всё

/**
     * @var array the parsers for converting the raw HTTP request body into [[bodyParams]].
     * The array keys are the request `Content-Types`, and the array values are the
     * corresponding configurations for [[Yii::createObject|creating the parser objects]].
     * A parser must implement the [[RequestParserInterface]].
     *
     * To enable parsing for JSON requests you can use the [[JsonParser]] class like in the following example:
     *
     * ```
     * [
     *     'application/json' => 'yii\web\JsonParser',
     * ]
     * ```
     *
     * To register a parser for parsing all request types you can use `'*'` as the array key.
     * This one will be used as a fallback in case no other types match.
     *
     * @see getBodyParams()
     */
    public $parsers = [];

caHek2x
Сообщения: 1226
Зарегистрирован: 2016.04.12, 20:41

Re: Не могу получить данные из POST Ajax

Сообщение caHek2x » 2017.04.11, 17:27

демонстрирую:
вьюшка:

Код: Выделить всё

<script>
	function send(){
		var csrfToken = $('meta[name="csrf-token"]').attr("content");
		$.ajax({
			type    : "POST",
			url     : "<?= yii\helpers\Url::toRoute(['/site/test-json'])?>",
			data    : {
				_csrf: csrfToken,
				id   : 123,
				test : 456
			},
			dataType: "json",
			success : function (data){
				console.log(data);
			}
		});
	}
</script>
<?=\yii\helpers\Html::button("Тест", ['onclick'=>'send()']);?>
контроллер:

Код: Выделить всё

use Yii;
use yii\web\Controller;
use yii\web\Response;

class SiteController extends Controller
{
	public function actions()
	{
		return [
			'error' => [
				'class' => 'yii\web\ErrorAction',
			],
		];
	}

	public function actionTestJson()
	{
		if(Yii::$app->request->isAjax)
		{
			Yii::$app->response->format = Response::FORMAT_JSON;
			return ['test' => 123];
		}
		return $this->render('test-json');
	}
}
запускаем, нажимаем кнопку
в консоле браузера:
https://yadi.sk/i/qqOSOE1U3GsAqd
в дебагер:
https://yadi.sk/i/lw3ZCNJz3GsAsV

в конфиге:

Код: Выделить всё

	'request'      => [
		'cookieValidationKey' => '....',
	],

sosnovskiy
Сообщения: 239
Зарегистрирован: 2017.03.28, 20:03

Re: Не могу получить данные из POST Ajax

Сообщение sosnovskiy » 2017.04.11, 17:40

Я вас изначально не правильно понял.
В этом случае jquery согласно dataType: json понимает что ожидается json строка и преобразует ее в массив.

Из вашего сообщения я подумал об этом куске:

Код: Выделить всё

$data = $request->post();
Соответственно что бы метод post вернул массив при входящем запросе с json данными, request компонент должен иметь парсер соответвующий контент тайпу запроса.

Да, и в вашем случае вы ajaxом отправляете обычный POST запрос. Но ни как не json

guru_nemo
Сообщения: 64
Зарегистрирован: 2017.04.10, 21:28

Re: Не могу получить данные из POST Ajax

Сообщение guru_nemo » 2017.04.11, 18:12

Сделал следующее:

Код: Выделить всё

if ($request->isPost && $request->isAjax)
        {
            $data = \Yii::$app->request->getRawBody();
            echo json_encode($data);
        }
в $data получается id=4
можно ли как-то эту $data преобразовать в массив или объект средствами yii2?

Ответить