2015-11-10 2 views
3

Проблема в том, что ответы сервера RESTful в Yii2 возвращаются как XML, и мне нужно, чтобы они были в формате JSON.RESTful ответ, как вернуть JSON вместо XML в Yii2?

Я следовал руководству от Yii2, контроллер выглядит одинаково, модель отличается от другой, она связана с базой данных (ранее модель была скопирована из модели по умолчанию в расширенном шаблоне) и веб-конфигурацией так же, как и руководство.

Просто для уточнения каких-либо сомнений, вот код:

UserController.php

<?php 
namespace app\controllers; 

use yii\rest\ActiveController; 

class UserController extends ActiveController 
{ 
    public $modelClass = 'app\models\User'; 
} 

web.php ($ конфигурации)

$config = [ 
    'id' => 'basic', 
    'basePath' => dirname(__DIR__), 
    'bootstrap' => ['log'], 
    'components' => [ 
     'request' => [ 
      // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation 
      'cookieValidationKey' => 'WgkzlqvStTfGXY-ToFlQIJRDMX4LUQtY', 
      'parsers'=>[ 
       'application/json'=>'yii\web\JsonParser' 
      ] 
     ], 
     'cache' => [ 
      'class' => 'yii\caching\FileCache', 
     ], 
     'user' => [ 
      'identityClass' => 'app\models\User', 
      'enableAutoLogin' => true, 
     ], 
     'urlManager' => [ 
      'enablePrettyUrl' => true, 
      'enableStrictParsing' => true, 
      'showScriptName' => false, 
      'rules' => [ 
       ['class' => 'yii\rest\UrlRule', 'controller' => 'user'], 
      ], 
     ], 
     'errorHandler' => [ 
      'errorAction' => 'site/error', 
     ], 
     'mailer' => [ 
      'class' => 'yii\swiftmailer\Mailer', 
      // send all mails to a file by default. You have to set 
      // 'useFileTransport' to false and configure a transport 
      // for the mailer to send real emails. 
      'useFileTransport' => true, 
     ], 
     'log' => [ 
      'traceLevel' => YII_DEBUG ? 3 : 0, 
      'targets' => [ 
       [ 
        'class' => 'yii\log\FileTarget', 
        'levels' => ['error', 'warning'], 
       ], 
      ], 
     ], 
     'db' => require(__DIR__ . '/db.php'), 
    ], 
    'params' => $params, 
]; 

Я попытался настройки компонента конфигурации :

response=>[ 
    'format'=>yii\web\Response::FORMAT_JSON 
] 

... но он по-прежнему отвечает XML. Что мне делать, чтобы заставить его отвечать JSON?

ответ

4

Вы можете установить его сначала по вызову, как показано ниже:

\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; 

Например:

public function actionView($id) 
{ 
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; 
    $user = \app\models\User::find($id); 
    return $user; 
} 

Вы также можете использовать ContentNegotiator фильтр в вашем поведении класса, как показано ниже:

/** 
* @inheritdoc 
*/ 
public function behaviors() 
{ 
return [ 
    [ 
     'class' => \yii\filters\ContentNegotiator::className(), 
     'only' => ['index', 'view'] 
     'formats' => [ 
      'application/json' => \yii\web\Response::FORMAT_JSON, 
     ], 
    ], 
]; 
} 
+1

Но есть ли способ установить это глобально? Вместо добавления этого в каждый контроллер? – nosthertus

+0

@nosthertus Посмотрите http://stackoverflow.com/questions/27180059/execute-my-code-before-any-action-of-any-controller –

+0

Я пробовал ваш метод через контроллеры, и он работает, но я пробовал, что ваши ссылочные сообщения показывают, и он не работает, он все равно будет отвечать как xml, вы можете увидеть здесь код: http://pastebin.com/PawqVx7X – nosthertus

0

Просто установите формат ответа в вашей конфигурации приложения:

Смежные вопросы