尝试编码json并在400: Bad Request
中接收yii2
。我正在尝试在Rest客户端编码,但它无法正常工作。
<?php
namespace app\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\TblUserRegistration;
class UserController extends Controller
{
public function actionRegister()
{
$model = new TblUserRegistration();
$username = $_POST['username'];
echo json_encode($username);
}
}
?>
答案 0 :(得分:2)
$socketfile = getenv('CPANEL_PHPCONNECT_SOCKET');
答案 1 :(得分:1)
我认为400与json_encode无关
谷歌“yii2 csrf”了解更多信息。
public function actionRegister()
{
// is not safe
Yii::$app->controller->enableCsrfValidation = false;
// set response header
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$model = new TblUserRegistration();
$username = $_POST['username'];
return $username;
}
或在视图中添加scrf: 形式:
<input name="_csrf" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">
元:
<?= Html::csrfMetaTags() ?>
答案 2 :(得分:1)
解决方案1:如果您的所有控制器操作都将传递json,您也可以考虑使用yii\rest\Controller代替yii \ web \ Controller:
namespace app\controllers;
use Yii;
class UserController extends \yii\rest\Controller
{
public function actionRegister()
{
$username = Yii::$app->request->post('username');
return $username;
}
}
注意:如果您需要处理CRUD操作,也可以使用ActiveController扩展yii\rest\Controller(请参阅rest docs)。
解决方案2:使用yii\web\Controller扩展yii\filters\ContentNegotiator时的另一种方法。请注意,将$enableCsrfValidation
设置为 false 可能是强制性的,因为它在related docs中进行了解释:
是否启用CSRF(跨站点请求伪造)验证。 默认为true。启用CSRF验证后,表单将提交给 Yii Web应用程序必须源自同一个应用程序。 如果没有,将引发400 HTTP异常。
注意,此功能要求用户客户端接受cookie。也, 要使用此功能,通过POST方法提交的表单必须包含一个 隐藏输入,其名称由$ csrfParam指定。你可以用 yii \ helpers \ Html :: beginForm()生成他的隐藏输入。
以上代码可以这样重写:
namespace app\controllers;
use Yii;
use yii\web\Controller;
use yii\filters\ContentNegotiator;
use yii\web\Response;
class UserController extends Controller
{
public $enableCsrfValidation = false;
public function behaviors()
{
return [
'contentNegotiator' => [
'class' => ContentNegotiator::className(),
'formats' => [
'application/json' => Response::FORMAT_JSON,
],
'only' => ['register'],
],
];
}
public function actionRegister()
{
$username = Yii::$app->request->post('username');
return $username;
}
}