在 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 解析器就会失败。只有当我删除示例并放入我的格式化数组时它才起作用,尽管我仍然不确定为什么它不适用于基本示例。
蛋糕新手,在基础知识上苦苦挣扎。我想创建一个 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 解析器就会失败。只有当我删除示例并放入我的格式化数组时它才起作用,尽管我仍然不确定为什么它不适用于基本示例。