2012-08-31 41 views
2

通常,對於模型中的CRUD操作URL模式可以是這樣的(假設模型是郵政):嵌套模型寧靜狀CRUD操作網址模式

new: /posts/new(get) 
create:/posts/(post) 
edit:/posts/edit(get) 
update:/posts/1(put) 
get:/posts/1(get) 

然而,如果有一個嵌套模型「的評論」。

而「郵政」和「評論」的協會是一個很多。

那麼CURD操作url模式應該如何評論?

new: /posts/1/comments/new or /comments/new 
create:? 
edit:? 
update:? 
....... 

最佳實踐是什麼?


更新:

似乎對此事發表評論的網址應該是這樣的:

Get one comment for one post: /posts/1/comments/1 

create: /posts/1/comments 

update: /posts/1/comments/1 

delete: /posts/1/comments/1 

現在我很困惑與更新和刪除操作。

對於更新和刪除:/posts/1/comments/1

由於指定了評論的ID,所以我不知道如果URL裏面的/posts/1是必要的嗎?

+0

你最終選擇了什麼? – bryanmac

回答

3

我認爲關鍵是評論是否被帖子資源「包含」。請記住,RESTful網址應該是永久鏈接,因此在所有情況下,特定評論的終點不得更改。它聽起來像是被包含的,所以url模式可以在帖子內嵌入註釋。如果情況並非如此(例如,評論可能會轉移到另一個帖子,如果嵌套會改變url),那麼您需要一個更加扁平化的結構,其中/ comment/{id}網址由帖子資源引用)。

關鍵是如果它是一個RESTful「超媒體API」,那麼它就像它不斷鏈接到嵌套或引用資源的網絡。它不依賴於客戶必須瞭解REST模式或特定知識,以瞭解哪些終點持有引用或包含的資源。

http://blog.steveklabnik.com/posts/2012-02-23-rest-is-over

如果 '註釋' 是資源(S)下一個 '後' 資源:

([httpVerb]/URL)

收到信息:

[get] /posts/{id} 
body has a couple options - either it contains the full deep comments array 
(depends on how much data, chat pattern) 
{ 
    id:xxx, 
    title:my post, 
    comments: [...] 
} 

... or it just contains the post resource with a url reference to the comments e.g. 
{ 
    id: xxx, 
    title: my post, 
    commentsUrl: /posts/xxx/comments 
} 

could also have an option like this (or other options to control depth): 
[get] /posts/{id}?deep=true 

在一篇文章中獲得評論集:

[get] /posts/{id}/comments 
returns 200 and an array of comments in the response body 

創建註釋的一個帖子:

[post] /posts/{id}/comments 
body contains json object to create 
returns a 201 created 

編輯下發表評論:

[patch|post] /posts/{id}/comments/{id} 
body contains json object with subset of fields/data to update 
returns a 200 

更換後:

[put] /posts/{id}/comment/{id} 
body contains json object to *replace* 
returns a 200 

如果你有一大堆的每發表評論,你也可以考慮尋呼模式:

{ 
    id: xxx, 
    title: myPost, 
    pages:6, 
    commentsUrl:/posts/xxx/comments/page/1 
} 

然後:

/posts/{id}/comments/pages/{pageNo} 

{ 
    nextPage: /posts/xxx/comments/2, 
    pages:7, 
    comments: 
    [ { ...,...,}] 
} 

每一頁將引用下一個頁面,頁面計數和用於該頁面的評論的陣列。如果你使用了分頁模式,那麼數組中的每個註釋都會有一個參考網址給個人評論。

如果您發現自己在url中添加了一個動作,那麼您可能會做錯某些事情。好讀:http://blog.steveklabnik.com/posts/2011-07-03-nobody-understands-rest-or-http

+0

非常感謝您的回覆,但我還有問題可以檢查我的更新嗎? :) – hguser

+0

如果評論ID是唯一的,無論帖子如何,您都可以在技術上做/評論/ 1。但我會(1)在動詞的格式上保持一致,(2)回到評論是否被帖子「包含」(永遠不會移動)。此外,如果您使用的是/ post/{id}/comment/{id},則評論ID只能在該帖子內唯一(例如/ post/1/comment/1和/ post/2/comment/1) – bryanmac

+0

這個職位?如何實現它?現在我在mysql中有表格發表和發表評論,並且如果你在帖子內增加了,每個人都擁有唯一的ID – hguser

0

你想使用規範的URL刪除/更新,這將是一個完整的。更重要的是,您不應該將您的主鍵值從數據庫中公開爲api,這是您寧靜的URL空間。根據數據庫更新,從備份還原或其他任何操作(取決於供應商),這些值可能會在將來發生變化。而且,如果您可以提供幫助,則不需要進行基礎結構更改,使所有網址無效。

如果您使用的是/posts/{postnum}/comments/{commentnum},您可以對每個帖子從1開始編號公開評論id,以製作更短,更好的網址。