3

根据这个 Cakephp CookBook RESTful api 的简单设置:

HTTP Method     URL.method  Controller action invoked
GET     /recipes*.method*   RecipesController::index()
GET     /recipes/123.method     RecipesController::view(123)
POST    /recipes*.method*   RecipesController::add()
PUT     /recipes/123*.method*   RecipesController::edit(123)
DELETE  /recipes/123.method     RecipesController::delete(123)
POST    /recipes/123*.method*   RecipesController::edit(123)

这里所有的 URL 参数都是数字,即 123。当我尝试使用字符串时,即

GET     /recipes/test.json  RecipesController::view(123)

这给了我一个错误:

{
   code: "404"
   url: "/myproject/recipes/test.json"
   name: "Action RecipesController::test() could not be found."
}

这里是网址

     "/myproject/recipes/test.json" // doesn't work

but 
      "/myproject/recipes/123.json" // works 

我用了默认Router::mapResources('recipes')

提前致谢!

4

2 回答 2

6

好吧,阅读那段代码的 APIid ,在点之前传递的值会自动匹配到or UUID。就在那个 API 中有参数定义

'id' - 匹配 ID 时使用的正则表达式片段。默认情况下,匹配整数值和 UUID。

所做mapResources的只是添加Router::connect一些预先建立的选项(基本上具有:controller/:action/:id的形式)。

因此,如果规则是将 ids(蛋糕认为是整数)与正则表达式匹配,那么显然您的字符串没有通过该验证。所以Router跳过该connect规则并转到另一个,直到一个匹配。匹配的形式是:controller/:action.extension(可能)。这就是为什么您会收到该错误,test显然不是为了采取行动。

幸运的是,mapResources为自定义提供的选项之一是匹配$id.

要将字符串选项添加为“ids”(因为这是 REST 操作在添加连接路由时将接收的唯一变量mapResources),请更改验证该规则的正则表达式,如下所示

Router::mapResources('recipes', array('id'=>'[0-9A-Za-z]'));

或您想制定的任何规则(我对正则表达式不满意,因此请尝试将其调整为您需要的内容)。

查看API的文档,了解您可以添加哪些其他选项。

请记住,mapResources这样做可以让您的生活更轻松,因此,如果您需要更复杂的路线和更多参数或额外的东西,请考虑忘记mapResources并自己构建路线(就像您提供的链接页面底部所说的那样) .

于 2013-06-18T19:14:23.920 回答
1

在您的路线中定义以下代码:

// used for the rest API 
$routes->extensions(['json','xml']); // type of format you want to get response
$routes->resources('Api');

然后在控制器文件夹中为 API 创建一个控制器,如下所示

<?php
namespace App\Controller;
use Cake\I18n\Time;
use Cake\Database\Type; 
Type::build('date')->setLocaleFormat('yyyy-MM-dd'); // customize date format

// src/Controller/RecipesController.php
class ApiController extends AppController
{

    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('RequestHandler');
        // load Model 
        $this->loadModel('Sales'); // load model to fetch data from database
        $this->Auth->allow();      // allow URL to public in case of Auth check 
    }

    public function beforeFilter(\Cake\Event\Event $event)
    {
        parent::beforeFilter($event);
        $this->loadComponent('RequestHandler');     
        $this->loadComponent('Flash');

    }

    public function index($fromdate = null, $todate = null)
    {
        //set date range to fetch the sales in particular date 
        if(!empty($_GET['fromdate_utc']) && !empty($_GET['todate_utc'])){
            // if from amd to date are same add +1 day in to date to get result 
            $to_date = date('Y-m-d', strtotime($_GET['todate_utc'] . ' +1 day'));
            $dateRage = array('Sales.SalesDate >= ' => $_GET['fromdate_utc'], 'Sales.SalesDate <=' => $to_date);
        }else{
            $dateRage = array();                    
        }

        $conditions = array(
            'and' => array($dateRage),
        );

        //$this->Auth->allow();
        $sales= $this->Sales->find('all', array(
                        'conditions' => $conditions
                    ))
                    ->select(['SalesNo', 'SalesDate', 'TotalValue', 'TotalDiscount', 'NetTotal', 'PaymentMode', 'Status'])
                    ->where(['StoreId' => '1']);
       // set data for view or response of API
        $this->set([
            'sales' => $sales,
            '_serialize' => ['sales']
        ]);
    }

}

?>

如何在 API URL 中传递参数以检查以下 XML 格式:-

https://example.com/api/index.xml?fromdate_utc=2016-10-03&todate_utc=2016-10-03

如何在 API URL 中传递参数以检查以下 JSON 格式:-

https://example.com/api/index.json?fromdate_utc=2016-10-03&todate_utc=2016-10-03
于 2016-11-21T09:49:16.460 回答