2009-09-18 23 views
2

我有一個RESTful-ish URL的rails應用程序,我需要傳遞一個字符串(標記)集合,而且我不想使用查詢字符串。什麼是傳遞字符串集合作爲參數的最佳REST式方法?

目前我使用類似的路線來/controller/tagged/:tags/foo/:foo/bar/:bar.:format

這需要「標籤」進行編碼這是一種痛苦如果你想手動輸入URL的話,容易出錯。

像/ controller/tagged/tag1/tag2/tag3/foo ...這樣的其他方法很難實現,因爲它們不明確(不清楚標記列表結束和其他參數開始的位置)。

其他人如何處理這種事情,您將其表達爲軌道路線的解決方案是什麼?

回答

-1

那麼你可以隨時張貼他們。

+1

REST使用POST進行特殊目的(創建一個新資源),所以如果他試圖獲取資源,他不會使用POST ... – SingleShot 2009-09-18 21:03:05

+1

他實際上並沒有說他在做什麼: - ) – SingleShot 2009-09-18 21:04:23

+0

@SingleShot好點,做得好:-)基本上我試圖檢索由參數過濾的資源集合。它們實際上是位置 - 通過標記,原點,距離等過濾。所以是的,它應該是一個GET。我希望能夠緩存它。 – frankodwyer 2009-09-18 21:20:11

4

假設您正在嘗試GET資源,也許是「問題列表」,並且您希望基於一組「標記」(這是一個好主意!)過濾列表。

您的URL應該是資源的路徑。也許/questions將是一個很好的URL。我知道你不想爲你的標籤使用URL參數,但是在GET上,這就是他們的目的 - 過濾或自定義資源視圖。因此,要篩選的利益,而不是讓所有的問題,幾個科目,您的URL可能看起來像:

/questions?tag=ruby-on-rails&tag=restful&tag=url-routing 

我相信這是RESTful方式。替代品可能是可口的,但我認爲他們會違反REST的「純粹」形式。

+0

我在這裏查詢字符串的問題是,當緩存到頁面緩存時,rails似乎沒有考慮到它。換句話說,/ questions?tag = foo和/ questions?tag = bar將會進入頁面緩存中的相同位置:/ questions – frankodwyer 2009-09-18 21:24:29

+0

我將不得不在某個時候處理這​​個問題,所以就去了並挖了一點。搜索揭示了一個共同的主題:使用允許您定製緩存鍵的rails插件(允許params成爲鍵的一部分)。問題是,這樣做是否違反REST或緩存問題的軌道專用?下面是該插件的鏈接:http://agilewebdevelopment.com/plugins/action_cache – SingleShot 2009-09-18 21:46:49

+0

爲行動緩存,我已經能夠得到使用香草欄像這樣:caches_action:controller,:expires_in => 1.hour, :cache_path => Proc.new {| c | 「control /#{c.params [:bar]} /#{c.params [:foo]}」。gsub(//,'')} 這會將參數填入緩存路徑中,請求被分開緩存。不過,我不確定這需要什麼版本的rails - 我使用的是2.3.2。另外,我不知道是否可以在頁面緩存方面進行類似的操作。 – frankodwyer 2009-09-18 22:44:07

2

使用查詢字符串。它正是出於這個目的:將編碼參數傳遞給資源。

使用路徑元素的版本掩蓋了/controller/tagged是被查詢的實際資源的事實,其中標記作爲請求的參數。

明白爲什麼路徑的做法是不是平安,考慮以下兩個網址:

http://example.com/controller/tagged/foo/bar

http://example.com/controller/tagged/bar/foo

在你給的描述,這些應該是指的同一個虛擬集合標記的項目。但是,在一個RESTful系統中,URL明確地指向一個且只有一個資源。您的基於路徑的尋址將許多URL與單個結果相關聯。

+0

我的問題與查詢字符串(至少是我最後一次使用它),是它被忽略的緩存。我需要回復到頁面緩存。 – frankodwyer 2009-09-18 21:15:43

+0

btw +1觀察兩個網址映射到相同的資源集合 - 沒有想到這一點。不確定這是實踐中的問題,但避免它會很好。 – frankodwyer 2009-09-18 21:26:13

+0

在這種情況下,您可能需要在控制器中自己管理緩存,而不是在頁面級緩存。在控制器動作中嘗試像'cache(:key =>「tagged /#{params [:tag] .join(',')}」)do ...',捕獲查詢結果和模板渲染返回已標記資源的列表。 – rcoder 2009-09-18 21:27:52

1

Sam Ruby和Leonard Richardson在他們的書Restful Web Services中推薦使用逗號或分號(以及用於算法資源的查詢變量)分隔非分層數據。

+0

您可以詳細說明'算法資源查詢變量'嗎?沒有得到 - 任何例子? – frankodwyer 2009-09-18 21:27:06

+0

以www.google.com/search?q=jellyfish爲例,應比www.google.com/search/jellyfish更好地解決搜索問題 – 2009-09-18 21:45:22

相關問題