为什么 jquery ajax post 请求在 yii2 中出错?
Why jquery ajax post request get error in yii2?
js:
$.ajax({
url: '/site/updateuserdata',
method: 'POST',
//async: true,
//cache:false,
data: {
'type': 'sort'
//val: val
//csrfParam: csrfToken
},
dataType: 'text',
error: function(jqXHR, textStatus, errorThrown) {
alert('error by ajax');
},
success: function(data, status, jqXHR) {
alert('success by ajax');
}
});
控制器:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['updateuserdata'],
'allow' => true,
// 'roles' => ['*'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'updateuserdata' => ['post'],
],
],
];
}
public function actionUpdateuserdata()
{
/*if (Yii::$app->request->isAjax) {
$message = 'Ваше сообщение успешно отправлено';
Yii::$app->response->format = Response::FORMAT_JSON;
$response = [
'success' => true,
'message' => $message
];
return $response;
}*/
$f = fopen('testajax.txt','a+');
fwrite($f, 'ajax: '.(isset($_POST['type'])?$_POST['type']:'error'));
fclose($f);
if(isset($_POST['type']))
return $_POST['type'];
else return 'error1';
// return Yii::$app->getResponse()->redirect(Yii::$app->request->referrer, 302, FALSE);
}
yii.js:
function initRedirectHandler() {
// handle AJAX redirection
$(document).ajaxComplete(function (event, xhr) {
var url = xhr && xhr.getResponseHeader('X-Redirect');
alert(url); //my code
if (url) {
window.location.assign(url);
}
});
}
我看到第一个 alert(ajax error) "error by ajax" 然后是 alert(yii.js) "..../site/updateuserdata...",为什么 ajax错误?文件 testajax.txt
未创建。
我尝试评论 'updateuserdata' => ['post'],
,但也出现错误。
已更新。
另外,试过:
public function beforeAction($action)
{
if ($action->id == 'updateuserdata') {
$this->enableCsrfValidation = false;
}
return parent::beforeAction($action);
}
并取消注释 ajax 中的 csrf 参数。
并且 'error' return 状态 302(jqXHR.status).
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
因为你评论了
//csrfParam: csrfToken
从您的 ajax js
文件中,您的 ajax.
中有 400
http 状态代码
所以你可以通过两种方式解决:
一个: 通过添加
禁用 csrf validation
$this->enableCsrfValidation = false;
在您的 actionUpdateuserdata
方法中。
两个: 将 csrf token
和 csrf param
添加到您的 ajax.
在您的 js 中打印此代码,在您注释的地方。
Yii::$app->request->csrfParam . ':' . Yii::$app->request->csrfToken
那么您的请求发送成功,如果您有其他错误,您必须检查您的代码。
我发现了问题,这是个愚蠢的问题:
url: '/mag/updateuserdata/',
我在 'urlManager':
'suffix' => '/',
我认为这是为所有人添加的,但不是.....
js:
$.ajax({
url: '/site/updateuserdata',
method: 'POST',
//async: true,
//cache:false,
data: {
'type': 'sort'
//val: val
//csrfParam: csrfToken
},
dataType: 'text',
error: function(jqXHR, textStatus, errorThrown) {
alert('error by ajax');
},
success: function(data, status, jqXHR) {
alert('success by ajax');
}
});
控制器:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['updateuserdata'],
'allow' => true,
// 'roles' => ['*'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'updateuserdata' => ['post'],
],
],
];
}
public function actionUpdateuserdata()
{
/*if (Yii::$app->request->isAjax) {
$message = 'Ваше сообщение успешно отправлено';
Yii::$app->response->format = Response::FORMAT_JSON;
$response = [
'success' => true,
'message' => $message
];
return $response;
}*/
$f = fopen('testajax.txt','a+');
fwrite($f, 'ajax: '.(isset($_POST['type'])?$_POST['type']:'error'));
fclose($f);
if(isset($_POST['type']))
return $_POST['type'];
else return 'error1';
// return Yii::$app->getResponse()->redirect(Yii::$app->request->referrer, 302, FALSE);
}
yii.js:
function initRedirectHandler() {
// handle AJAX redirection
$(document).ajaxComplete(function (event, xhr) {
var url = xhr && xhr.getResponseHeader('X-Redirect');
alert(url); //my code
if (url) {
window.location.assign(url);
}
});
}
我看到第一个 alert(ajax error) "error by ajax" 然后是 alert(yii.js) "..../site/updateuserdata...",为什么 ajax错误?文件 testajax.txt
未创建。
我尝试评论 'updateuserdata' => ['post'],
,但也出现错误。
已更新。
另外,试过:
public function beforeAction($action)
{
if ($action->id == 'updateuserdata') {
$this->enableCsrfValidation = false;
}
return parent::beforeAction($action);
}
并取消注释 ajax 中的 csrf 参数。 并且 'error' return 状态 302(jqXHR.status).
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
因为你评论了
//csrfParam: csrfToken
从您的 ajax js
文件中,您的 ajax.
400
http 状态代码
所以你可以通过两种方式解决:
一个: 通过添加
禁用csrf validation
$this->enableCsrfValidation = false;
在您的 actionUpdateuserdata
方法中。
两个: 将 csrf token
和 csrf param
添加到您的 ajax.
在您的 js 中打印此代码,在您注释的地方。
Yii::$app->request->csrfParam . ':' . Yii::$app->request->csrfToken
那么您的请求发送成功,如果您有其他错误,您必须检查您的代码。
我发现了问题,这是个愚蠢的问题:
url: '/mag/updateuserdata/',
我在 'urlManager':
'suffix' => '/',
我认为这是为所有人添加的,但不是.....