代码之家  ›  专栏  ›  技术社区  ›  Wouter den Ouden

提供id参数时,Yii2 UrlManager REST API GET 404错误

  •  1
  • Wouter den Ouden  · 技术社区  · 10 年前

    我用Yii2基本模板制作了一个RESTAPI。我对webconfig做了一些更改,以便我可以使用web/users和web/users/1等链接。它很好,但我无法再访问web/index。所以我在UrlManager中添加了更多规则。

    'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                //basic/web
                '<controller:\w+>/<id:\d+>' => '<controller>/view',
                '<controller:[\w\-]+>/<action:[\w\-]+>/<id:[\d]+>' => '<controller>/<action>',
                '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
    
    
                //basic/web/users
                ['class' => 'yii\rest\UrlRule', 'controller' => ['user', 'car']],
                //basic/web/countries
                //Id is een string, vandaar de tokens
                ['class' => 'yii\rest\UrlRule', 'controller' => 'country', 'tokens' => ['{id}' => '<id:\\w+>']],
            ],
        ],
    

    使用上面的代码,我可以访问web/索引。我还可以访问web/用户以获得用户列表。但我无法访问web/users/1。它给出了一个404错误。

    编辑:

    'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                //basic/web
                /*
                '<controller:\w+>/<id:\d+>' => '<controller>/view',
                '<controller:[\w\-]+>/<action:[\w\-]+>/<id:[\d]+>' => '<controller>/<action>',
                '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
                */
    
    
    
                //basic/web/users
                ['class' => 'yii\rest\UrlRule', 'controller' => ['user', 'car', 'site']],
                //basic/web/countries
                //Id is een string, vandaar de tokens
                ['class' => 'yii\rest\UrlRule', 'controller' => 'country', 'tokens' => ['{id}' => '<id:\\w+>']],
            ],
        ],
    

    我把它改成这样了。现在我可以访问网站了,因为它是多元化的。 但如果我去web/站点/关于,它会再次出现404错误。所以这不是最好的解决方案

    1 回复  |  直到 10 年前
        1
  •  1
  •   Salem Ouerdani    10 年前

    我认为在同一个配置文件中维护RESTAPI和HTML网页并不容易。例如,根据REST的无状态特性,通常会禁用Cookie和会话,而您可能需要同时使用这两种功能来验证经典HTML页面中的用户身份。

    我建议修改应用程序结构,并将REST API实现为独立的 module 有自己的路由配置,也可能有自己的 Entry Script 而不会错过 web 进入

    更好的结构可能如下所示: (来自下面链接的教程)

    + web
    + config
    + controllers
    ...
    + api
      + config
      + modules
        + v1
          + controllers
      .htaccess
      index.php
    

    然后您就可以在 web/sites/about 在中检索资源时 api/users/1 。每个条目可以承载自己的 controllers 并拥有 models 或者他们可以共享 @app/models 。请查看此分步教程以了解如何实现它:

    Creating a REST API for Yii2-basic-template - 作者Joachim Werner

    您也可以检查 api auth 中的文件夹 this app 其中两者都是独立的REST API。