2011-07-20 47 views
16

我剛剛讀完Restful Web ServicesNobody Understands REST or HTTP,並試圖用RESTful設計來設計API。爲什麼有人會在URI中用'API'設計一個RESTful API?

我注意到在API URI設計的幾個模式:

http://api.example.com/users 
http://example.com/api/users 
http://example.com/users 

假設這些設計正確使用AcceptContent-type頭爲XHTML,JSON,或任何格式之間content negotiations

這些URI是否爲 REST式實現與隱式內容協商?

我的想法是,通過顯式使用的URI API是爲了讓客戶將期望的數據格式本身不是人賞心悅目的超媒體可以更容易地消耗不明確設置的Accept頭。換句話說,API暗示您期望JSON或XML而不是XHTML。

這是一個在邏輯上在服務器端分離資源表示 的問題嗎?

的唯一理由,我可以想出爲什麼有人會設計他們的URI與API子域是關閉基於我的假設,這是一個縮放技術,因爲,它應該在一個多路由請求負載更容易分層服務器基礎架構。也許情況下反向代理正在剝離標題?我不知道。處理不同表示的不同服務器?

也許子域僅用於外部使用者,以便服務器避免內部使用的開銷。限速?

我錯過了一個觀點嗎?

我提出的設計將嘗試通過設置適當的報頭,適當使用HTTP動詞和時尚,我覺得包括在URI「API」是多餘的代表資源遵循REST風格的做法。

爲什麼有人會在URI中用'API'設計一個RESTful API?

或者他們可以嗎?也許我不明白這個設計的問題是它沒關係,只要它遵循一些可能不會導致RESTful API實現的規範組合但並不重要? 皮膚鍵盤貓有多種方法。 HATEOAS有關聯的?


更新:雖然研究這個題目我都來,這是很重要的考慮從REST的想法,但不把它當作一種宗教的結論。因此,在URI中是否有'api'更像是一個設計決定,而不是一個堅定的規則。如果你計劃公開你的網站的API,使用api子域來幫助處理應用程序的邏輯是一個好主意。我希望有人會貢獻自己的洞見,讓別人學習。

回答

5

這是我的理解和你的問題的觀點:

難道這些URI是一個純粹的RESTful實現VS隱含 內容協商的問題?

不,他們不是任何官方文檔(我知道的)的一部分,並且通常以開發者/團隊標準爲準。例如,Zend Framework使用一些實用程序類來檢測XHR請求以及應如何返回響應。當然,ZF不是純粹的RESTful設計(或者大多數PHP應用程序),但即使在PHP中也可以編寫這樣的設計。

我經常看到api正在使用的網址,當返回的數據預期並不意味着用於顯示給最終用戶。然而,它通常是一個設計決定,並不一定是一個隱含的標準。

這是一個分離資源表示邏輯上 服務器端的問題?

或多或少。例如,執行PUT請求時,例如,接口不一定需要完全刷新,並且通常一個簡單的響應消息就足夠好了。雖然此響應消息是該視圖的一部分,但它不是視圖。因此,例如,http://domay.com/users/會返回接口來管理用戶(或其他),http://domain.com/users/api將執行操作並返回接口更新(無需重新加載頁面)。

我錯過了一個觀點嗎?

Well,no。由於這是一個在網址中使用或不使用api的設計決定,因此您在此處不會丟失任何內容。使用正確的標題,

http://domain.com/users/api/get 
http://domain.com/users/get 
http://domain.com/users/ 

都可以是有效的RESTful請求。

爲什麼有人會在URI中用'API'設計一個RESTful API?

簡而言之,有一個URL命名約定。所以,當在日誌,文檔等中查看請求時,人們會明白它的目的。

11

我會(並且已經)將它與「網站」基礎結構分開,因爲它可能會有更高的負載並需要更多的基礎設施 - 每天執行數百萬次API調用要比獲得該調用容易得多在頁面瀏覽量中,因爲您有n個網站/公司的全部負載以及他們的努力和牽引力,集體甚至在某些情況下,他們將單獨吸引比您自己更多的流量。

5

還要記住,大多數框架(django,RoR,...)提供基於URL的路由。對於API和HTML響應,您可能需要不同的視圖來以不同方式管理身份驗證,小跑,限制檢查和其他特定內容。

如您所說,建立一個額外的基於HTTP頭的路由系統,允許隱式內容協商往往不值得。

4

用戶可見的網頁的URL受網站管理員,設計師,企業組織,市場營銷,時尚,科技的率性等

的API,而另一方面,應該保持穩定。通過使用子域,您可以將API與網站的其他部分隔離開來,並且可能會及時進行更改。