我正在研究Web Api應用程序,目前我正在努力理解RESTful API設計。REST - 查詢字符串與URL路徑
比方說,有一個發佈資源/api/posts
,我希望客戶有機會請求當月的所有帖子。 從我的理解有兩種方法來實現這一點。
一種方法是將當前月份作爲資源。 另一種方式可能是Post資源的查詢字符串。
什麼是最好的(RESTful)方式來做到這一點?
api/posts/currentmonth
或
api/posts?stardate=???&enddate=???
我正在研究Web Api應用程序,目前我正在努力理解RESTful API設計。REST - 查詢字符串與URL路徑
比方說,有一個發佈資源/api/posts
,我希望客戶有機會請求當月的所有帖子。 從我的理解有兩種方法來實現這一點。
一種方法是將當前月份作爲資源。 另一種方式可能是Post資源的查詢字符串。
什麼是最好的(RESTful)方式來做到這一點?
api/posts/currentmonth
或
api/posts?stardate=???&enddate=???
什麼是最好的(REST風格)的方式來做到這一點?
REST不關心URI設計。
URI設計準則主要旨在讓事情變得更容易;或者通過使拼寫更易於推理,或者使路由實現更易於使用。
Alan Bates answered這在軟件工程上非常透徹。總結:RFC 3986告訴我們層次屬於路徑,非層次數據屬於查詢。
一種方法可能是將當前月份作爲資源。另一種方式可能是Post資源的查詢字符串。
小心...
api/posts
api/posts?stardate=???&enddate=???
這些都是不同資源,儘可能REST和REST風格的客戶的關注。查詢字符串是標識符的一部分。
說同樣的事情用不同的方式
GET /api/posts?stardate=???&enddate=??? ...
意味着
Resource(/api/posts?stardate=???&enddate=???).get()
不
Resource(/api/posts).get(stardate=???&enddate=???)
Resource(/api/posts).query(stardate=???&enddate=???).get()
你的路由架構可轉換前者爲後者的一個,但是這是一個實現細節。 REST旨在將這些細節與接口分開,以便客戶端和服務器可以獨立進化。
爲什麼是api/posts和api/posts?stardate = ??? & enddate = ???不同的資源?我一直認爲查詢字符串只是查詢資源的一種方式。
我的理解是,這種觀點有些過時。
RFC 1630確實包括一個定義,與該解釋
問號(「?」,ASCII 3F十六進制)對準用於分隔可查詢對象的URI之間的邊界,和一組用於表示對該對象的查詢的單詞。當使用這種形式時,組合的URI表示查詢應用於原始對象所產生的對象。
但是,標準的語言是由我們得到了RFC 3986
組件包含數據路徑的時間變化,通常是有組織的分層形式,在非分層查詢數據沿,組件(Section 3.4)用於標識URI的方案和命名權限(如果有的話)範圍內的資源。
加上強調
資源的關鍵特徵,如由調遣所描述的,是它們是抽象的。
REST使用資源標識符來標識組件間交互所涉及的特定資源。 REST連接器爲訪問和操作資源的值集提供了一個通用接口,而不管成員函數是如何定義的或處理請求的軟件的類型如何。
換句話說,可能通過將一個查詢的一個對象來產生所述表示,或者它可能通過訪問文檔存儲時使用所述識別符作爲密鑰被生成 - 或在高速緩存中的條目。客戶端(和中間組件)不需要知道任何有關它在接口後面隱藏的實現;他們只是確定他們感興趣的概念圖,並讓服務器完成它的工作。
感謝您的回答。爲什麼'api/posts'和'api/posts?stardate = ???&enddate = ???'不同的資源?我一直認爲查詢字符串只是查詢資源的一種方式。 –