更改Yii2 API操作

时间:2017-12-16 01:38:56

标签: php ajax rest yii2-advanced-app

我使用yii2(2.0.13)。当我用ajax发送数据时,返回响应包含错误。

我的代码:

namespace frontend\controllers;

use Yii;
use yii\rest\ActiveController;    

class CityController extends ActiveController
{
    public $modelClass = 'frontend\models\City';

    public function actions()
    {
        $actions = parent::actions();
         unset($actions['create']);
        return $actions;
    }    

    public function behaviors()
    {
        $behaviors = parent::behaviors();

        // remove authentication filter
        $auth = $behaviors['authenticator'];
        unset($behaviors['authenticator']);

       // add CORS filter
        $behaviors['corsFilter'] = [
            'class' => \yii\filters\Cors::className(),
        ];

        // re-add authentication filter
        $behaviors['authenticator'] = $auth;
        // avoid authentication on CORS-pre-flight requests (HTTP OPTIONS method)
        $behaviors['authenticator']['except'] = ['options'];

        return $behaviors;
    }    

    public function actionCreate()
    {
      echo 'Hi i\'m create!!';
    }
}    

和ajax请求:

$.ajax({
            url: "http://blog.dev/city", // our php file
            type: 'POST',
            contentType: false,
            cache: false,
            processData: false,
            data: {x: 'data_text'},
            success: function(data){
                console.log(data);
            },
            error: function (request) {
                console.log(request);
            }
        });    

在actionCreate中添加 exit() 时,问题就解决了。
问题在哪里以及我应该如何更改actionCreate? 请帮帮我。

1 个答案:

答案 0 :(得分:1)

客户端发送ajax请求,因此Yii2也应该像ajax请求一样处理请求。你需要改变这样的代码:

<?php
...
public function actionCreate()
{
  if (Yii::$app->request->isAjax) {
      // DO SOMETHING
      \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
      return [
          'message' => 'Hi i\'m create!!'
      ];
  }
}

客户端你可以这样:

$.ajax({
   url: '<?php echo Yii::$app->request->baseUrl. '/ads' ?>',
   type: 'post',
   data: {
              x: 'data_text', 
             _csrf : '<?=Yii::$app->request->getCsrfToken()?>'
         },
   success: function (data) {
      console.log(data.message);
   }

});

重要!如果enableCsrfValidation中有TRUE,则需要发送CSRF令牌