2016-01-28 14 views
7

Tentativo di codificare JSON e ricezione 400: Bad Request in yii2. Sto cercando di codificare nel client Rest, ma non funziona correttamente.come codificare Json in 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); 
     } 
    } 
?> 

Immagine di errore. enter image description here

immagine Errore enter image description here

+1

set formato di risposta a '\ Yii \ web \ Response :: FORMAT_JSON;' –

+0

Insane è giusto. Utilizza \ yii \ web \ Response :: FORMAT_JSON; – frops

+1

aggiungi il campo nascosto nel modulo per csrf: '' –

risposta

1

Soluzione 1: Nel caso in cui le azioni di tutto il controller vi consegneranno JSON si può anche considerare extanding yii\rest\Controller invece di 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; 
    } 
} 

NOTA : è inoltre possibile utilizzare che si estende yii\rest\Controller (vedere rest docs) se è necessario gestire le operazioni CRUD.


Soluzione 2: Un approccio diverso quando estendentesi yii\web\Controller è usando yii\filters\ContentNegotiator. Si noti che l'impostazione $enableCsrfValidation a falso può essere obbligatorio qui come è spiegato nella sua related docs:

Sia per abilitare CSRF (Cross-Site Request Forgery) convalida. Il valore predefinito è true. Quando la convalida CSRF è abilitata, i moduli inviati a un'applicazione Web Yii devono essere originati dalla stessa applicazione. In caso contrario, verrà sollevata un'eccezione 400 HTTP.

Nota: questa funzione richiede che il client utente accetti i cookie. Inoltre, per utilizzare questa funzione, i moduli inviati tramite il metodo POST devono contenere un input nascosto il cui nome è specificato da $ csrfParam. È possibile utilizzare yii \ helpers \ Html :: beginForm() per generare il proprio input nascosto.

Il codice di cui sopra può essere riscritta in questo modo:

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

penso che 400 non hanno nulla a che fare con json_encode

google "yii2 CSRF" per ulteriori informazioni.

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

o aggiungere SCRF in vista: forma:

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

meta:

<?= Html::csrfMetaTags() ?>

+0

Bel google su csrf su cattiva richiesta. –

+0

@suibber Grazie per la risposta, ma ancora non funziona. C'è bisogno di ulteriori configurazioni in yii? –

+0

puoi paset il log degli errori? – suibber

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