如何在yii2中编码Json?

bha*_*uva 7 php json yii2

试图JSON编码和接收400: Bad Requestyii2.我试图在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);
        }
    }
?>
Run Code Online (Sandbox Code Playgroud)

错误图片.在此输入图像描述

错误图片在此输入图像描述

Sal*_*ani 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:如果您需要处理 CRUD 操作,您还可以使用扩展yii\rest\Controller的ActiveController(请参阅其余文档)。


解决方案 2:扩展yii\web\Controller 时的另一种方法是使用yii\filters\ContentNegotiator。请注意,此处可能强制设置$enableCsrfValidationfalse,如相关文档中所述:

是否启用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;
    }
}
Run Code Online (Sandbox Code Playgroud)