首页 > 解决方案 > Codeigniter4 - 默认情况下将数组数据返回为 JSON 而不是 XML

问题描述

我只是在尝试使用新的 Codeiginiter4 框架。我创建了一个路由并将其附加到一个简单的方法todos,当我尝试点击 URL 时,它应该以 JSON 形式返回 todos(task) 列表,但它以 XML 格式返回。代码很简单,

class Home extends BaseController
{
    use ResponseTrait;

    public function index()
    {
        return view('welcome_message');
    }

    public function todos()
    {   
        return $this->respondCreated(['todos' => ['task' => 'Check out new CI4']]);
    }

    //--------------------------------------------------------------------
}

// 结果

<response>
<todos>
<task>Check out new CI4</task>
</todos>
</response>

后来我发现,如果我将数组显式编码为 JSON(使用 json_encode),它会在浏览器中将结果作为 JSON 返回。像这样,

public function todos()
{   
    return $this->respondCreated(json_encode(['todos' => ['task' => 'Check out new CI4']]));
}

所以我的问题是有没有办法在 CI4 的浏览器中默认返回数组为 JSON 格式?

我正在使用的 CI 版本:v4.0.2

标签: phpjsoncodeigniter

解决方案


你要求一个 xml 响应,所以 CI4 会给你你所要求的。您应该在返回响应之前定义您的 http 标头以请求 json。

public function todos()
    {   
       $this->request->setHeader('Accept', 'application/json');
        return $this->respondCreated(['todos' => ['task' => 'Check out new CI4']]);
    }

注意:如果你总是想要 json 响应,你可以去app/Config/Format.php注释掉一行,这样你的$supportedResponseFormats变量看起来像这样:

    public $supportedResponseFormats = [
        'application/json',
//      'application/xml', // machine-readable XML
        'text/xml', // human-readable XML
    ];

问题是您正在删除 CI4 以这种方式处理 xml 响应的能力。

查看 CI4 优秀文档以获取更多详细信息:https ://codeigniter.com/user_guide/outgoing/api_responses.html#handling-response-types


推荐阅读