簡體   English   中英

具有關聯資源的REST服務的正確URI設計是什么

[英]What is the correct URI design for a REST service with associated resources

大家好,

我是REST和Web API的新手。 我對如何為我的資源設計URI感到有些困惑。

鑒於我有一個具有以下資源的域:博客,帖子和用戶。

Blog (1) ------ (0..*) Post (0..*) ------ (1) User

一個博客可以有多個帖子,每個帖子都與一個博客相關聯。 一個用戶可以有多個帖子,並且每個帖子都與一個用戶相關聯。

對於博客和用戶資源,URI如下所示:

GET /blogs - get list of all blogs
GET /blogs/{id} - get blog by id
POST /blogs - create new blog
PUT /blogs/{id} - update blog
DELETE /blogs/{id} - delete blog

GET /users- get list of all users
GET /users/{id} - get user by id
POST /users - create new user
PUT /users/{id} - update user
DELETE /users/{id} - delete user

但是帖子資源呢? 如何處理關聯? 我在考慮以下替代方案-哪些正確,為什么?

-通過博客獲取所有帖子

1. GET /blogs/{id}/posts
or
2. GET /posts?blogid={id}

-在博客中創建新帖子

3. POST /blogs/{id}/posts
or
4. POST /posts (here I would then in the payload send the IDs of the resources this post is associated with. BlogId and UserId)

-通過博客和用戶獲取所有帖子

5. GET /blogs/{id}/posts?userid={id}
or
6. GET /posts?blogid={id}&userid={id}

如果有人能在正確的方向指出我,我將不勝感激。

由於帖子始終與博客和用戶ID相關聯,因此我將選擇選項1、3和5:

GET /blogs/{id}/posts
POST /blogs/{id}/posts
GET /blogs/{id}/posts?userid={id}

您應該問自己的第一個問題是,您的API真正是RESTful對您來說有多重要? 實際上,它比看起來要實現的要復雜得多。

  1. 您的API是否僅會由您自己的軟件\\組織使用?

  2. 您的API會附帶文檔嗎?

如果上述1或2的答案是正確的,那么真正實現RESTful的價值值得懷疑……對於REST來說,它是全有還是全無,所以您要么全力以赴,要么不用擔心。

為了使API成為真正的REST API,必須可以從單個入口點對其進行發現(請參見此處: http : //roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven )。 每個調用都應返回可以在該資源上進行的其他相關調用的信息。通常通過某種類型的鏈接,這是一種可能的結構:

{
    "Id" : 1,
    "Identifier" : "123's First Blog",
    "links" : [
        {
            "rel": "http://myapi/res/posts",
            "href": "http://myapi/blog/1/posts"
        },
        {
            "rel": "http://myapi/res/users",
            "href": "http://myapi/user/123"
        }
    ]
}

rel是對資源的摘要\\定義的鏈接,href應指向api本身。

無論如何,所有這些的要點是,如果您確實想真正實現RESTful,那么讓資源和uri之間的聯系決定設計。 考慮一下如何從單個起點發現每個呼叫的細節,並且結構應該像通過TDD進行軟件設計一樣展現自己。

如果您不需要使用RESTful,那么事情就會變得簡單得多。 只需以最自然的方式為您,您的體系結構和開發人員設計API。 如果您正確地編寫了文檔,那么這將導致API效率更高,並且可以更快地開發API。

馬里奧(Mario)對這個問題的回答是正確的,我也希望這些選擇勝於其他選擇。 我只是認為您應該了解伴隨這樣的決定而產生的整個故事。

如果這樣做沒有意義,或者您想獲取更多信息,請發表評論,我將盡力幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM