如何在yii2中编码Json?

时间:2016-01-28 08:58:41

标签: php json yii2

尝试编码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);
        }
    }
?>

错误图片。enter image description here

错误图片enter image description here

3 个答案:

答案 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;
    }
}