Попытка кодировать 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); } } ?>
Ошибка изображения.
Изображение ошибки
Решение 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; } }
ПРИМЕЧАНИЕ. Вы также можете использовать ActiveController, который расширяет yii \ rest \ Controller (см. Остальные документы ), если вам нужно обрабатывать операции CRUD.
Решение 2. Разный подход при расширении yii \ web \ Controller осуществляется с помощью yii \ filters \ ContentNegotiator . Обратите внимание, что установка $enableCsrfValidation
на false может быть обязательной здесь, как это объясняется в связанных документах :
Включить ли проверку подлинности CSRF (Подтверждение межсайтового запроса). Значение по умолчанию равно true. Когда включена проверка CSRF, формы, представленные в веб-приложение Yii, должны быть получены из одного и того же приложения. Если нет, будет вызвано исключение 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; } }
public function actionRegister() { \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; $model = new TblUserRegistration(); return $_POST['username']; }
я думаю, что 400 не имеет ничего общего с json_encode
google "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; }