2012-01-12 33 views
4

我在php中實現了REST服務。關於PHP,rewrite和http-verbs的REST實踐

q1。我可以拆分控制器和資源嗎?

http://myserver/myCtrl.php?res=/items/1 

q2。如果沒有,是重寫iis,apache,nginx等標準規格(如果有的話),以便在重寫時生存http-verb?

如果不是,如何解決?

回答

3

對於API的(我有這樣一個框架)我傾向於具有一個URL的結構,如下所示:

http://domain.com/api/ [資源]/[ID]/[子資源]

我通過與htaccess的文件解析傳入請求,並傳遞關閉的初步認識控制器請求的所有請求到前端控制器。所以我的index.php類似於在非常簡單的下面:

<?php 

$request = explode('/', trim($_SERVER['REQUEST_URI'], '/')); 

$resource_name = ucfirst($request[0]).'Controller'; 
$http_verb = strtolower($_SERVER['REQUEST_METHOD']); 

$controller = new $resource_name; 

$response = call_user_func_array(array($controller, $http_verb), array($request)); 

header('Content-Type: application/json'); 
echo json_encode($response); 

所以,如果你http://domain.com/api/news,那麼它會嘗試實例化一個類所謂NewsController,如果它是一個的GET POST請求要求那麼這個類的get()方法,或post(),等等。該調用的響應然後以JSON的形式返回給客戶端。

希望這應該足以讓你開始。

+0

謝謝,它確實有意義,動詞應該在mod_rewrite中生存下來。 – Teson 2012-01-18 13:31:07

+0

是的。關於使用默認實現的最好的事情是你不必在你的PHP代碼中做任何特殊的事情來處理它。 – 2012-01-18 16:47:42

+0

你可以發佈你的htaccess嗎?當你執行'$ resource_name = ucfirst($ request [0])。'Controller'時讀取你的代碼;'它應該加載apiController,因爲api是request_uri的第一項 – Atomico 2016-04-21 10:51:35

2

我有一些相同的問題,發現這個視頻非常有益的(沒有標準,但良好的做法):

http://blog.apigee.com/detail/slides_for_restful_api_design_second_edition_webinar/

我通過.htaccess文件重寫的URL來實現我的休息服務(mod_rewrite的)和中心調度員,所以它看起來是這樣的:

http://myserver/myctrl/resource/1

我的.htaccess:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ index.php?/$1 [QSA,L] 
</IfModule> 

瞭解更多關於重寫: http://httpd.apache.org/docs/current/mod/mod_rewrite.html

我有一個索引文件,該文件確實差不多就是馬丁概述。我在「/」上爆炸,並假設第一個是控制器,第二個是動作,其餘的是參數。

+0

謝謝。 (但> 50分鐘來描述REST?不是很安靜......) – Teson 2012-01-18 13:31:50