2009-10-08 64 views
11

由於找不到chuffing工作,我一直在閱讀ReST和創建Web服務。我已經解釋了它的方式,未來就是在構建Web應用程序之前爲您的所有數據創建Web服務。這似乎是一個好主意。ReSTful URLS的標準是什麼?

然而,似乎有很多矛盾的想法是什麼最好的方案是ReSTful網址。

有人主張簡單漂亮的URL

http://api.myapp.com/resource/1 

此外,有些人喜歡在API版本添加到URL,像這樣

http://api.myapp.com/v1/resource/1

使事情更加混亂,有人主張增加內容類型來獲取請求

http://api.myapp.com/v1/resource/1.xml 
http://api.myapp.com/v1/resource/1.json 
http://api.myapp.com/v1/resource/1.txt 

而其他人認爲內容類型應該在HTTP標頭中發送。

Soooooooo ....這是很多變化,這讓我不確定什麼是最好的URL方案。我個人認爲包含版本號,資源定位器和內容類型的最全面的URL的優點,但我是新手,所以我可能是錯的。

另一方面,你可能會認爲你應該做「最適合你的任何事情」。但據我所知,這並不符合ReST的思路,因爲其目標是制定一個標準。

而且由於很多人會有比我更多的經驗,所以我想請教一些指導。因此,考慮到這一切...

ReSTful URLS的標準是什麼?

+1

考慮修復標題。 「最好」並不意味着什麼。而且你的問題比一個模糊的揮手更具體。動詞和響應格式有兩個具體問題。請修正您的問題標題,以清楚地反映您的實際問題。 – 2009-10-08 11:17:08

回答

9

歡迎來到什麼是和什麼不是REST的混淆世界。首先,我會建議你在錯誤的地方閱讀了關於REST的內容。嘗試RESTWiki是一個很好的起點。

REST不是爲您的Web應用程序提供數據服務的絕佳解決方案。 「Web服務」(又稱SOAP,XML-RPC,WSDL,HTTP-POX)可能會有所幫助,但REST架構風格更傾向於客戶端 - 服務器場景而不是服務器服務器場景。

不要再考慮網址的樣子。他們看起來像使用哪個服務器端框架來實現RESTful服務,而不是服務本身的設計。客戶端應該從以前檢索的表示中發現URL,因此它並不關心URL的外觀。

話雖如此,使用您的示例網址來嘗試和區分你認爲應該是不同的資源,我還有一些其他的建議。

不要版本資源。即如果您有一個資源被url http://example.org/TodaysWeather訪問,請不要在http://example.org/V2/TodaysWeather創建資源。有很多其他更好的方式來表示版本,而不是創建一個全新的資源。搜索大量的其他討論。至於爲不同的內容類型創建不同的資源,我認爲這是一個上下文特定的決定。如果您的最終用戶使用瀏覽器訪問REST服務,並且它們足夠複雜以瞭解JSON和XML之間的差異,那麼請繼續並創建兩個資源。如果它是一臺機器客戶端,那麼我會使用內容協商來獲得所需的格式。

最後,要小心,因爲REST成爲流行語,因爲周圍存在的錯誤信息遠多於有效內容。

+0

我認爲,其中很多都是主觀的。在語義上,不明確地版本化特定資源是有意義的,除非這是業務問題的實際部分(即,我想查看兩年前我的InsuranceCoverage資源,而不是現在)。但是我會提出,在URL的開頭部分推出「v1」使得它明確說明您正在與之交談的API的版本。你也可以想象服務器的代碼是如何整潔的 - 當創建V2時,V1代碼不會受到影響,因爲這些代碼都是新類,不需要在請求的Version標頭中插入switch語句。 – 2009-10-08 12:55:32

+0

當大多數人談論版本控制時,他們並不是指「業務相關」版本。你說得對,如果它與業務相關,那麼把它變成另一種資源是有道理的。 當您正確使用超媒體並且只有部分API需要新版本時,向URI添加版本會非常麻煩。現在您可以使用指向來自V1 api的資源的V2 urls訪問這些表示。 – 2009-10-08 13:42:25

+0

至於在服務器端進行整理,版本控制媒體類型可以很容易分開。通常,已經存在一種機制來「切換」內容類型,因此向內容類型添加版本只是重用該機制來提供正確的版本。 – 2009-10-08 13:43:08

3

動詞不能放入URL中。這是沒有意義的。它已經在請求標題中。當你發送一個在URL中有GET的POST請求時,這太瘋狂了。

響應格式通常最好放入URL中,因爲標題不提供簡單明確的地方放置該信息。

+0

你是對的,我誤解了這篇文章,並把它作爲面值http://microformats.org/wiki/rest/urls – gargantuan 2009-10-08 11:18:09

+0

對於你的第二句話,「響應格式通常是最好的放入URL,因爲標題不要提供一個簡單明瞭的地方來提供這些信息。「 - 當然他們做!接受就是這樣,並得到很好的支持。 – 2012-12-05 11:45:37

3

我與S.Lott - Verb *不應該在那裏,因爲您想使用相同的URL來讀取記錄,並更新它以使其符合REST要求。

內容類型是別的東西,因爲它是相同的記錄,但具有多種編碼格式。 (閱讀FRBR的方式比您想要了解的區別問題更多)。可以使用HTTP Accept標頭處理決定發送哪個版本的響應。

唯一一個我討厭的是版本號,因爲我個人不會想到一個合適的HTTP頭來處理它的方面。 (預計接受編碼Pragma可能甚至是升級,但出於兼容性的原因,你會更經常地想降級到較舊的版本,我想)我可能會有一個版本較少的訪問器,它提供了最新的生產版本,但可能會考慮有一個版本不適合向後兼容的重大更改。

更新:版本問題可能取決於您對連接到您的服務的客戶端有多少控制權......如果你有從廣泛的公衆(我不這樣做)訪問,你可能更感興趣的是向後兼容性。根據所做的更改,您可能會認爲'版本2'是一種全新的資源,而不僅僅是原始版本的新版本。

+0

將不會有一個可選的版本號使mod_rewrite和路由更困難?此外,通過在那裏安裝版本號,人們可以更輕鬆地升級和降級,只需在引導區中安裝所需的api版本,而不必手動更改每個請求。 – gargantuan 2009-10-08 11:51:00

+1

如果希望服務器能夠提供兩種不同版本的表示形式,則內容類型是您將使用的標題。例如應用程序/ vnd.twitter。statusesV1 + xml和application/vnd.twitter.statusesV2 + xml使用此方法,客戶端可以請求他們理解的版本,並且可以在不中斷客戶端的情況下引入新版本。顯然,媒體類型的設計首先應該儘可能具有變化的靈活性,並且引入新的版本號應該是最後的手段,因爲它會打破舊客戶端。 – 2009-10-08 12:53:24

+1

Darrel - HTTP'Accept'頭部是客戶端用來指定他們願意消費什麼類型的東西,然後服務器會響應(設置適當的內容類型)或狀態406(不可接受) – Joe 2009-10-08 16:15:19

3

版本控制:我通常在您的示例url中看到了它的位置,如果沒有指定版本,您應該使用最新的生產版本進行響應。一個考慮因素是是否將API版本放在您的響應字符串中以用於客戶端調試目的。

響應格式:返回格式應在用戶代理髮送的HTTP Accept報頭中指定。

請求字符串中的動詞:絕對不是。

+0

是否有可用性的爭論。如果通過瀏覽器訪問服務,則URL是用戶界面的一部分。所以,雖然它應該在HTTP Accept頭中,但也可以通過在url中使用它。 – gargantuan 2009-10-08 11:38:31

+0

在這種情況下,我認爲真正的可用性問題出現在接受標頭中的JSON和URL中的XML中。 – Nicholas 2009-10-08 11:57:22

+0

如果你正在使用一個較老的API並添加一個新版本(其中沒有指定版本參數),那麼我會建議,如果沒有收到版本參數的請求被接收到,你會使用最舊版本的API而不是最新的;否則,你會打破舊客戶。如果這種「最近期」行爲是從API的V1開始指定的,那麼它會沒事的。我的兩分錢。 – 2009-10-10 13:42:22