在 cakephp3 中,我如何创建一个 REST API,其中输出类型可以定义为 JSON 或 XML?

In cakephp3 how do I create a REST API where output types can be defined as either JSON or XML?

蛋糕新手,在基础知识上苦苦挣扎。我想创建一个 API 本质上为用户提供数据库访问权限。

所以,我希望我的路线如下所示:

-/myAPI/view/viewname.xml -/myAPI/view/viewname.json

本质上,这些 url 将 return 在 xml 或 JSON 中定义的视图中的所有数据。

这是我为视图创建的路线示例:

use Cake\Core\Plugin;
use Cake\Routing\Router;

Router::defaultRouteClass('Route');

Router::scope('/', function ($routes) {
    $routes->connect('/', ['controller' => 'Homepage', 'action' => 'index']);
});

Router::scope('/myAPI', function ($routes) {
    $routes->extensions(['json', 'XML']);
    $routes->resources( 'View',
            ['only' => ['view'],
            'id'=>'[0-9a-zA-Z]+']);
});

Plugin::routes();

当我导航到 /myAPI/view/name.xml 时,我得到:

<response>
<message>Invalid input.</message>
<url>/myAPI/View/name.xml</url>
<code>500</code>
</response>

这是我在控制器中的视图方法:

public function view($viewname)
{
$response = array('foo' => 'bar');

$this->set('response', $response);
$this->set('_serialize', 'response');
}  

它适用于 .json,但不适用于 .xml。这是为什么?

谢谢

如果 json 响应正常,请尝试以下操作

Router::scope('/myAPI', function ($routes) {
$routes->extensions(['json', 'xml']);
});

而不是'XML'

我也推荐你this教程。

编辑:

我刚在控制器中实现

public function view($viewname)
{
    $response = array('foo' => 'bar');
    $this->set('response', $response);
    $this->set('_serialize', 'response');
}

在routes.php

Router::scope('/myAPI', function ($routes) {
$routes->extensions(['json', 'xml']);
});

使用这个 URL:

myAPI/controllername/view/name.xml

我收到了成功的回复。

检查您的 URL 我相信您缺少控制器名称。

我不知道为什么,但它现在开始工作了。可能是一些缓存问题。

我注意到要使 XML 正常工作,您需要在设置响应行中定义一个键。

示例:

$this->set('response', array('RESPONSE' => $someArrayData));

没有这个 XML 解析器就会失败。只有当我删除示例并放入我的格式化数组时它才起作用,尽管我仍然不确定为什么它不适用于基本示例。