目前我在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提供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"
}
}
答案 0 :(得分:6)
经过三天的痛苦,我找到了解决方案。当你来自ExpressJS和NodeJS的整个JSON世界时,有时很难解释这个问题。从逻辑上讲,Yii2的功能非常好,另一方面,90%的RESTful API希望输出为JSON,因此每次进行API调用时都不需要设置请求标头。
浏览器默认情况下将请求标头添加为“Application / XML”,因此您在屏幕上看到的是XML而不是JSON。
Yii2的内容协商员收到标题后,application / 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',
],
],
]);
}
答案 1 :(得分:3)
我测试你的代码并且它完美地工作
我的控制器:
<?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"]}
检查您的命名空间或发送您的代码!