2014-02-19 39 views
1

給予一定的情況下,我最初開始了我的API看起來像這樣:如何在「清理」PHP REST API後訪問查詢字符串參數?

http://myserver/api.php?action=projects 

在我api.php文件我有一個簡單的if語句來檢測的動作,然後做出相應的反應:

if (isset($_GET["action"]) 
{ 
    switch($_GET["action"]) 
    { 
     case "projects" 
      dostuff(); 
     break; 
     case "otherstuff" 
      dootherstuff(); 
     break; 
     ... 
    } 
} 

不過,我當然想打掃一下,這樣我就可以去這個網址:

http://myserver/api.php/projects 

,並得到了相同的結果。我能做到這一點通過閱讀了以前一個SO帖子:

Using Clean URLs in RESTful API

而最終得到它通過在我的根目錄.htaccess文件,並使用重寫引擎,像這樣的工作:

RewriteEngine On 
RewriteRule ^action/([^/\.]+)/?$ api.php?action=$1 [L] 

這工作得很好!除了一個問題,因爲我正在使用乾淨的URL,它不再認爲GET參數存在。

我發現我可以使用 $ _SERVER ['REQUEST_URI'];

然後解析URL以獲取我的參數。雖然我開始引入多個參數,但我不明白這是如何解決的。有什麼我在這裏失蹤,還是我需要以不同的方式來看待它,並改變我如何格式化參數?

+0

我不確定我是否清楚瞭解您的問題。你能否澄清一下哪些工作沒有成功。 – anubhava

+0

@anubhava問題是,當我使用乾淨的網址時,全局變量$ _GET在我的api.php中是空的。不過,我仍然想訪問查詢參數,而不必分析包含整個請求字符串的$ _SERVER ['REQUEST_URI']。它能完全清除它嗎? – Bebhead

+0

對於哪個URI,您不會獲得'$ _GET'數組? – anubhava

回答

2

您可以使用這些規則:

RewriteEngine On 

RewriteRule ^(?:action|api\.php)/([^/.]+)/?$ api.php?action=$1 [L,NC,QSA] 
+0

看起來像是在將規則更改爲此操作後嘗試訪問「http:// myserver/api.php/projects」時出現404錯誤。 – Bebhead

+0

OK儘量做到'api.php?行動= $ 1 [L,NC,QSA]',而不是'/api.php?action=$1 [L,NC,QSA]'以上 – anubhava

+0

貌似是沒有的伎倆!謝謝。 – Bebhead

0

改成這樣:

RewriteEngine On 
RewriteRule ^action/([^/\.]+)/?$ api.php?action=$1 [L, QSA] 

您需要的QSA參數,以保持完整的查詢字符串。所以現在這是可能的:

/action/projects/?my=name 

或者,你可以這樣做:

RewriteEngine On 
RewriteRule ^action/([^/\.]+)/([^/\.]+)/?$ api.php?action=$1&method=$2 [L, QSA] 
RewriteRule ^action/([^/\.]+)/?$ api.php?action=$1 [L, QSA] 

現在你將有以下網址:

/action/projects/add/ 
/action/projects/ 
+0

感謝Niels的迴應。但我不太確定這是我所追求的。而不是/動作/項目/添加/我只想發送POST/GET請求到/ action/projects /或GET/PUT on/action/projects/id。我嘗試了你的第二個例子,在做出這個改變後我得到了INTERNAL SERVER ERROR 500。我從第一條規則中刪除了L標誌,但是根據我對Apache rewrite_mod的理解,第一條規則的輸出將應用於第二條規則? – Bebhead

+0

將使用第一個匹配。 L和QSA之間的空間可能需要刪除。我不知道爲什麼這會產生一個錯誤。它應該工作。 – Niels