我想尋求一些關於設計REST/hipermedia API的建議,特別是關於使用框架實現的建議。REST API - 媒體類型參數中的屬性過濾器
取而代之的是一般的'實體'的例子,我會用一個更平凡的'文檔'實體。
問題1:
GET /document/?[query]
得到的文件清單。問題在於「文檔」只有幾十個屬性,在很多情況下,客戶端只會關注少數幾個(特別是在此次搜索中) - 響應的大小可能會有幾個(最多10次)不等,而且服務器查詢可能會更快。另外,我不得不提到,我們更喜歡無模式。
我發現樣品如
GET /document/attr1, attr2../?[query]
我覺得這完全是非REST-FUL。
另一篇文章是建議使用內容類型(實際上接受,因爲它是請求),但是例子丟失了,仍然有混合的感覺。喜歡的東西:
Accept: application/json; attrs="attr1,attr2"
我不知道這是否是尊重HTTP的語義,並且如果這種使用的媒體類型參數是合適的(畢竟我要資源的不同表現 - 與某些屬性過濾掉)。
問題2:
如果上面或多或少aceptable的解決方案,我不知道是否有什麼準備django-rest關於自定義介質類型的屬性解析。從我在文檔中可以看到的信息來看,媒體類型參數不是單獨解析(或處理)的。
編輯
一些額外的信息:應用程序的很大一部分是OLTP(帶不會緩存)。架構是帶有靜態文件的JSON服務器,JS重型客戶端。
編輯2
其實,我發現了一些意見,在他們的自然搜索是新的(揮發性)資源(結果)創作,所以POST方法是比較合適的。這消除了討論中的問題。我對創建的實體(結果)有一些問題,因爲我不想堅持它,但我認爲這不是強制性的。問題是要在「位置」標題中添加什麼內容(僞造URL,沒有位置標題或其他內容)?對我來說唯一一致的行爲正是我不想做的 - 搜索POST執行搜索,將結果存儲在服務器端並返回201並鏈接到它。然而,這是沒有道理的持久負載...
關於瀏覽器測試,MIME類型text/html可能會提供一個用戶友好的搜索表單。
完全正確。我忽略了一個問題,即大部分請求都會禁用緩存。儘管如此,它可能會啓用,並且還會考慮REST設計的其他好處。在特定情況下,媒體類型參數的使用仍然存在問題(對於一般體系結構原則)。還有一個想法 - 媒體類型不應該影響緩存 - 如果它可以是json,xml或html,那麼對同一個URL的調用如何被緩存? –
爲了保持屬性集合的可擴展性,你可以簡單地考慮'GET/document /?[query]&attrs = attr1,attr2'。在Accept頭文件中指定屬性意味着您無法使用通用瀏覽器測試行爲。關於媒體類型:如果您要返回同一資源的各種媒體類型的表示,則服務器需要發出「Vary:Accept」。這表示高速緩存分別存儲不同的表示。在那個筆記上,我不相信每個緩存實現都知道如何處理媒體類型參數。 – fumanchu
經過一些想法實際上'GET/document/attr1,attr2 ../?[query]'比'GET/document /?[query]&attrs = attr1,attr2'要好於緩存(前提是通常每個客戶端版本正在使用相同的順序;據我所知,許多緩存代理忽略查詢字符串)。 –