2014-11-04 130 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" 

還有一兩件事要記住文件夾名稱也區分大小寫在聲明名稱空間的同時,請檢查文件夾名稱。