gpt4 book ai didi

php - 为什么 Yii2 休息 Controller 以 XML 格式给出响应?

转载 作者:可可西里 更新时间:2023-11-01 12:47:32 28 4
gpt4 key购买 nike

目前我在我的 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>

我让它工作的唯一方法是将这一行添加到每个 Controller 行为。我已经阅读了文档,其中说我可以在模块类上初始化它,所以我不这样做需要在每个 Controller 中执行此操作。我不知道为什么它会提供 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"
}
}

最佳答案

经过痛苦的三天后,我找到了解决方案。当您来自 ExpressJS 和 NodeJS 的整个 JSON 世界时,有时很难解释这个问题。从逻辑上讲,Yii2 所做的非常好,另一方面,90% 的 RESTful API 期望输出为 JSON,因此您不需要在每次调用 API 时都明确设置请求 header 。

默认情况下,浏览器将请求 header 添加为“应用程序/XML”,因此您在屏幕上看到的是 XML 而不是 JSON。

Yii2 的内容协商器在收到 header 后将 application/xml 格式化为 XML 格式的输出。如果您使用 CURL 或 PostMan 发出相同的请求, header 为“Application/JSON”,您将获得所需的输出。

如果您希望覆盖此行为,则只需在您的 Controller 中添加以下函数并包含以下内容:-

使用 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 - 为什么 Yii2 休息 Controller 以 XML 格式给出响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32176247/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com