Почему контроллер rest Yii2 дает ответ в формате XML?
В настоящее время я использую следующий код инициализации на моем модуле api
public function init()
{
    parent::init();
    Yii::$app->response->format = Response::FORMAT_JSON;
}
мой api возвращает ответ в формате XML в следующем примере.
public function actionTest()
{
    $items = ['one', 'two', 'three' => ['a', 'b', 'c']];
    return $items;
}
вот ответ:
<response>
  <item>one</item>
  <item>two</item>
   <three>
    <item>a</item>
    <item>b</item>
    <item>c</item>
   </three>
</response>
единственный способ заставить его работать-добавить эту строку к каждому поведению контроллера. я прочитал документацию, в которой говорится, что я могу инициализировать это в классе модуля, поэтому мне не нужно делать это в каждом контроллере. Я не знаю, почему он дает XML, хотя. и на всякий случай единственный способ-добавить его в мое поведение, мне нужно написать код для обработки имени, кода, состояния, типа, предыдущего и кода или Yii предоставляет YiirestController и yiirestActiveController, которые автоматически обрабатывают это. Очевидно, что они выводятся автоматически при возникновении ошибки.
{"name":"Not Found"
 "message":"Page not found.",
 "code":0,
 "status":404
 "type":"yiiwebNotFoundHttpException"
 "previous":{"name":"Invalid Route","message":"Unable to resolve the request: api/home/",
 "code":0,"type":"yiibaseInvalidRouteException"
 }
}
3 ответов
в приложениях Yii2 тип ответа по умолчанию-XML (и я думаю, что это по умолчанию для REST тоже). Во время HTTP-соединения обе стороны объявляют, какие данные могут отправлять и/или получать. Если эта информация не передается на сервер, тип данных по умолчанию-send (даже если вы указали, что это должен быть JSON в вашем приложении), чтобы гарантировать правильную связь. Если вы хотите получить данные JSON, вы должны добавить Accept: application/json заголовок к вашему запросу. И, вероятно, вам не нужно указывать его в php-коде, потому что Yii2 должен вычесть его из заголовков запросов.
вы можете найти больше объяснений, как это работает здесь.
после трех болезненных дней я нашел решения. Иногда довольно сложно объяснить эту проблему, когда вы исходите из целого мира JSON ExpressJS и NodeJS. Логически то, что делает Yii2, прекрасно, с другой стороны, 90% RESTful API ожидают, что вывод будет в JSON, поэтому вы явно не хотите устанавливать заголовки запросов каждый раз, когда вы делаете вызов API.
браузеры по умолчанию добавляют заголовки запросов как "Application / XML", следовательно, то, что вы видите на экране является XML вместо JSON.
переговорщик содержимого Yii2 при получении заголовков в виде application / xml форматирует ваш вывод в XML. Если вы сделаете тот же запрос, используя CURL или PostMan с заголовками, как "Application/JSON", вы получите желаемый результат.
Если вы хотите переопределить это поведение, просто добавьте функцию ниже в свой контроллер и включите следующее: -
использовать yii\web\Response; использовать yii\helpers\ArrayHelper;
public function behaviors()
  {
      return ArrayHelper::merge(parent::behaviors(), [
          [
              'class' => 'yii\filters\ContentNegotiator',
              'only' => ['view', 'index'],  // in a controller
              // if in a module, use the following IDs for user actions
              // 'only' => ['user/view', 'user/index']
              'formats' => [
                  'application/json' => Response::FORMAT_JSON,
              ],
              'languages' => [
                  'en',
                  'de',
              ],
          ],
      ]);
  }Я тестирую ваш код, и он отлично работает
мой контроллер следующим образом :
<?php
namespace backend\controllers;
use yii\rest\Controller;
use yii;
use yii\web\Response;
class TestController extends Controller{
    public function init()
    {
        parent::init();
        Yii::$app->response->format = Response::FORMAT_JSON;
    }
    public function actionTest(){
        $items = ['one', 'two', 'three' => ['a', 'b', 'c']];
        return $items;
    }
}
выход :
{"0":"one","1":"two","three":["a","b","c"]}
проверьте пространство имен или отправьте код !
