在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/视图/viewname.xml——/myAPI/视图/viewname.json

基本上,这些url将返回以xml或JSON定义的视图中的所有数据。

下面是我为View创建的路由示例:

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'

我也推荐你这个教程。

编辑:

我刚刚在控制器中实现了

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工作,您确实需要在set响应行中定义一个键。

的例子:

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

如果没有这个,XML解析器将失败。只有当我删除示例并放入我的格式化数组时,它才工作,尽管我仍然不确定为什么它不能与基本示例一起工作。