我在php中實現了REST服務。關於PHP,rewrite和http-verbs的REST實踐
q1。我可以拆分控制器和資源嗎?
http://myserver/myCtrl.php?res=/items/1
q2。如果沒有,是重寫iis,apache,nginx等標準規格(如果有的話),以便在重寫時生存http-verb?
如果不是,如何解決?
我在php中實現了REST服務。關於PHP,rewrite和http-verbs的REST實踐
q1。我可以拆分控制器和資源嗎?
http://myserver/myCtrl.php?res=/items/1
q2。如果沒有,是重寫iis,apache,nginx等標準規格(如果有的話),以便在重寫時生存http-verb?
如果不是,如何解決?
對於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的形式返回給客戶端。
希望這應該足以讓你開始。
我有一些相同的問題,發現這個視頻非常有益的(沒有標準,但良好的做法):
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
我有一個索引文件,該文件確實差不多就是馬丁概述。我在「/」上爆炸,並假設第一個是控制器,第二個是動作,其餘的是參數。
謝謝。 (但> 50分鐘來描述REST?不是很安靜......) – Teson 2012-01-18 13:31:50
謝謝,它確實有意義,動詞應該在mod_rewrite中生存下來。 – Teson 2012-01-18 13:31:07
是的。關於使用默認實現的最好的事情是你不必在你的PHP代碼中做任何特殊的事情來處理它。 – 2012-01-18 16:47:42
你可以發佈你的htaccess嗎?當你執行'$ resource_name = ucfirst($ request [0])。'Controller'時讀取你的代碼;'它應該加載apiController,因爲api是request_uri的第一項 – Atomico 2016-04-21 10:51:35