2016-01-28 14 views
7

Próba zakodowania json i otrzymania 400: Bad Request w yii2. Próbuję kodować w kliencie odpoczynku, ale nie działa poprawnie.jak kodować Json w yii2?

<?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); 
     } 
    } 
?> 

Obraz błędu. enter image description here

Błąd obraz enter image description here

+1

zestaw do '\ Yii \ Web \ Response :: FORMAT_JSON;' –

+0

Insane ma rację. Użyj \ yi \ web \ Response :: FORMAT_JSON; – frops

+1

dodaj ukryte pole w formularzu dla csrf: '' –

Odpowiedz

1

Rozwiązanie 1: W przypadku, gdy wszystkie działania kontroler będzie dostarczać json Można również rozważyć extanding yii\rest\Controller zamiast yii \ web \ Kontroler:

namespace app\controllers; 

use Yii; 

class UserController extends \yii\rest\Controller 
{ 
    public function actionRegister() 
    { 
     $username = Yii::$app->request->post('username'); 
     return $username; 
    } 
} 

UWAGA : możesz również użyć , która rozszerza yii\rest\Controller (patrz rest docs), jeśli potrzebujesz obsługi operacji CRUD.


Roztwór 2: Innym podejściem przy rozszerzaniu yii\web\Controller jest za pomocą yii\filters\ContentNegotiator. Należy pamiętać, że ustawienie $enableCsrfValidation do fałszywy może być obowiązkowe tutaj jak to wyjaśniono w swojej related docs:

czy włączyć CSRF (Cross-Site żądania fałszerstwo) zatwierdzenie. Domyślnym ustawieniem jest true. Gdy funkcja sprawdzania CSRF jest włączona, formularze przesłane do aplikacji WWW Yii muszą pochodzić z tej samej aplikacji. Jeśli nie, zostanie zgłoszony wyjątek HTTP 400.

Uwaga: ta funkcja wymaga, aby klient użytkownika akceptował pliki cookie. Ponadto, aby móc korzystać z tej funkcji, formularze przesłane za pomocą metody POST muszą zawierać ukryte wejście o nazwie określonej przez $ csrfParam . Możesz użyć yii \ helpers \ Html :: beginForm(), aby wygenerować ukryte dane wejściowe.

Powyższy kod może zostać przepisany w następujący sposób: format odpowiedzi

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; 
    } 
} 
1

myślę 400 nie mają nic wspólnego z json_encode

google "yii2 csrf", aby uzyskać więcej informacji.

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

lub dodać SCRF w widoku: forma:

<input name="_csrf" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">

meta:

<?= Html::csrfMetaTags() ?>

+0

Fajne wyszukiwanie w Google na temat csrf na złe żądanie. –

+0

@suibber Dzięki za odpowiedź, ale nadal to nie działa. Czy jest potrzeba więcej konfiguracji w Yii? –

+0

możesz paset dziennika błędów? – suibber

2
public function actionRegister() 
{ 
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; 
    $model = new TblUserRegistration(); 
    return $_POST['username']; 
}