为什么Yii2休息控制器以XML格式给出响应?

Len*_*rmi 7 php rest yii2

目前我在我的api模块上使用以下初始化代码

public function init()
{
    parent::init();
    Yii::$app->response->format = Response::FORMAT_JSON;
}
Run Code Online (Sandbox Code Playgroud)

我的api在以下示例中以XML格式返回响应.

public function actionTest()
{
    $items = ['one', 'two', 'three' => ['a', 'b', 'c']];
    return $items;
}
Run Code Online (Sandbox Code Playgroud)

这是回应:

<response>
  <item>one</item>
  <item>two</item>
   <three>
    <item>a</item>
    <item>b</item>
    <item>c</item>
   </three>
</response>
Run Code Online (Sandbox Code Playgroud)

我能让它工作的唯一方法是将这一行添加到每个控制器行为中.我已经阅读了文档,其中说我可以在模块类中进行此操作,因此我不需要在每个控制器中执行此操作.我不知道为什么它会提供XML.,万一唯一的方法是将它添加到我的行为中,我是否必须编写代码来处理名称,代码,状态,类型,以前的代码或者Yii提供yii\rest\Controller和yii\rest\ActiveController哪个自动处理这个.很明显,当出现错误时,它们会自动输出.

{"name":"Not Found"
 "message":"Page not found.",
 "code":0,
 "status":404
 "type":"yii\\web\\NotFoundHttpException"
 "previous":{"name":"Invalid Route","message":"Unable to resolve the request: api/home/",
 "code":0,"type":"yii\\base\\InvalidRouteException"
 }
}
Run Code Online (Sandbox Code Playgroud)

Vik*_*293 6

经过三个痛苦的日子,我找到了解决方案.当你来自ExpressJS和NodeJS的整个JSON世界时,有时很难解释这个问题.从逻辑上讲,Yii2的功能非常好,另一方面90%的RESTful API希望输出为JSON,因此每次进行API调用时都不需要设置请求标头.

浏览器默认将请求标头添加为"Application/XML",因此您在屏幕上看到的是XML而不是JSON.

收到标题后,Yii2的内容协商员将应用程序/ xml格式化为XML格式的输出.如果您使用带有标题为"Application/JSON"的CURL或PostMan发出相同的请求,您将获得所需的输出.

如果您希望覆盖此行为,只需在控制器中添加以下功能并包含以下内容: -

使用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',
              ],
          ],
      ]);
  }
Run Code Online (Sandbox Code Playgroud)


Gla*_*apa 4

在 Yii2 应用程序中,默认响应类型是 XML(我猜它也是 REST 的默认类型)。在 HTTP 连接期间,双方声明能够发送和/或接收的数据类型。如果此信息未传递到服务器,则默认数据类型为 send(即使您在应用程序中指定它应该是 JSON)以保证正确的通信。如果您想接收 JSON 数据,您必须Accept: application/json在请求中添加标头。也许你不必在 php 代码中指定它,因为 Yii2 应该从请求标头中扣除它。

您可以在此处找到其工作原理的更多说明。