2014-11-04 132 views
2

我试图按照指南中所述实现Yii2 RESTful Web服务API。我正在尝试使用高级应用程序模板。问题很简单,当我尝试访问服务时,我得到的所有404错误都是错误的。我想开始尝试一些简单的东西,所以我只是想使用国家表和相关的ActiveRecord类来试用它,代码如下:如何解决Yii2 RESTful Web服务API路由错误?

这是在frontend/config/main.php中的组件配置中:

'urlManager' => [ 
     'enablePrettyUrl' => true, 
     'enableStrictParsing' => true, 
     'showScriptName' => false, 
     'rules' => [ 
      ['class' => 'yii\rest\UrlRule', 'controller' => 'country'], 
     ], 
    ], 
    'request' => [ 
     'parsers' => [ 
      'application/json' => 'yii\web\JsonParser', 
     ] 
    ] 

这是在前端/控制器代码/ CountryController.php:

我的ActiveRecord模型,如国家的
namespace frontend\controllers; 

use yii\rest\ActiveController; 

class CountryController extends ActiveController 
{ 
    public $modelClass = 'common\models\Country'; 
} 

全部都是常见/模型。

我用下面来试试吧:

curl -i -H "Accept:application/json" "http://myfrontendapp.loc/country" 

这是输出我得到:

HTTP/1.1 404 Not Found 
Date: Fri, 31 Oct 2014 22:46:50 GMT 
Server: Apache 
Content-Length: 205 
Content-Type: text/html; charset=iso-8859-1 

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
<html><head> 
<title>404 Not Found</title> 
</head><body> 
<h1>Not Found</h1> 
<p>The requested URL /country was not found on this server.</p> 
</body></html> 

我已经在这个花了很多时间。我已经调整了设置,阅读文档,并且没有任何成功。如果有人可以看到问题是什么,请让我知道,谢谢!

+0

我尝试了基本的应用程序模板,并没有任何问题。如果有人知道如何使用高级应用程序模板来做到这一点,请告诉我。 – dataskills 2014-11-07 19:05:16

回答

5

您被默认的UrlRule行为复制类名称:符合常见的REST约定,它足够聪明,可以将名为country的控制器变为名为/countries的多元化路线。

尝试到GET http://myfrontendapp.loc/countries,它很可能会正常工作。这也适用于由UrlRule创建的所有其他路由,例如GET /countries/12345

或者,如果您想禁用此行为,则可以将UrlRule的$pluralize设置为false。查询http://www.yiiframework.com/doc-2.0/guide-rest-routing.html了解更多信息。

+0

我注意到,在文档中,我试过了,“国家”和“国家”的结果完全一样,没有运气。感谢您的建议! – dataskills 2014-11-05 17:09:42

0

试试这个:

  • advanced/api/web/index.html添加require(__DIR__ . '/../../common/config/bootstrap.php');代替require(__DIR__ . '/../../common/config/aliases.php');

  • advanced/common/config/bootstrap.php添加Yii::setAlias('api', dirname(dirname(__DIR__)) . '/api');

  • 期待通过this tutorial

并确保您的GET请求是正确的。从reqesst行删除'api/web'。只需使用v1/countrys

1

根据运行应用程序时的yii2 rest标准,您必须非常明确地使用您的URI,即当您运行国家/地区的应用程序时,在运行时复制它,因此在运行时应该运行为http://myfrontendapp.loc/countries。 但你仍然希望国家只在你的urlmanager类型'controller'=>['c','country']main.php。如果你的问题仍然存在,那么你需要检查你的dir结构......它应该是api,后端,api下的前端,它们应该是配置,moudles里面的模块--v1和里面的v1-- countrollers和models。 等
这必将解决您的问题...

0

你有没有放置

的.htaccess

的文件夹中

,如果没有创建

。 htaccess

,内容如下

RewriteEngine on 
# If a directory or a file exists, use the request directly 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
# Otherwise forward the request to index.php 
RewriteRule . index.php 

或者你可以一次检查与下列URL的请求,因为你正在使用先进的templaet

curl -i -H "Accept:application/json" "http://myfrontendapp.loc/frontend/web/index.php?r=countries" 

还有一两件事要记住文件夹名称也区分大小写在声明名称空间的同时,请检查文件夹名称。