如果這是重復的,我很抱歉,但我無法找到能回答我問題的主題。
我正在構建一個 MEAN 堆疊應用程式,并計劃在后端創建 REST API。現在我偶然發現了以下問題。
我有一個資源/discussion,其中包含用戶串列和帖子本身。
discussion = {
"name": "discussionName",
"用戶"。[<arrayOfUsersThatArePartOfThisDiscussion>]。
"帖子"。[<arrayOfPostsForThisDiscussion>] 。
}
我想實作的是列出用戶所參與的所有討論,這樣我就可以把這些討論介紹給他。現在,我不明白的是,什么才是最符合REST要求的方式。
。我的想法是:
為用戶維護一個討論串列。在這種情況下,用戶資源將大致如下:
user = { "id": "myId", "name": "MyName", "discussionIds": [<listOfDiscussionsImPartOf>] 。 }
如果這是我的表述,那么當用戶試圖在他之前沒有發表的討論中發表文章時會發生什么?
我的理解是,在這種情況下,POST /disucssions/:id/posts應該被執行以創建另一個帖子。
但是,誰在更新user/:userId/discussionIds?這是客戶的職責還是服務器的職責?
如果是服務器的職責,我如何強制該資源(user/:userId/discussions)的快取失效? 這樣我就能在以下GET user/:userId/discussions
- 不要在用戶資源中維護討論串列。
在這種情況下,我如何過濾用戶參與的討論? 我正在考慮使用GET操作的查詢字串,但我又該如何寫查詢,以便根據它的陣列中所提供的引數的存在來過濾資源? 為了清楚起見,我正在尋找類似的東西:
GET api.something.com/discussions?where userId in discussion.usersIds
希望你能回答我的問題。預先感謝
uj5u.com熱心網友回復:
為用戶保持一個討論串列。
是的,那是fine.
。當用戶試圖在他之前沒有發表過的討論中發表文章時會發生什么?我的理解是,在這種情況下,應該執行POST /disucssions/:id/posts來創建另一個帖子。
這是你的選擇。
想想我們在網路上是如何做這種事情的。 你想向 stack overflow 發送一個問題,所以你加載了一個表單,你在該表單中輸入了大量資訊,然后你提交了它。 結果是網路瀏覽器發送了一個 POST 請求,而請求目標是......。
好吧,在網路上,它是堆疊溢位放在表單本身的元資料中的任何目標。 用戶并不關心它的去向,你只是按下了按鈕。 瀏覽器也不關心--它只是把表單的元資料復制到HTTP請求中。 因此,控制表單的機構也可以選擇哪個資源作為目標。
因此,如果你想的話,你可以讓所有表單提交到同一個資源。 或者你可以為每一種表單設定一個單獨的資源。 或者為每個網頁上的每一種表單提供單獨的資源。
但是真正有趣的選擇是確定最重要的網頁,如果表單提交被正確處理,該網頁將被改變,因為 HTTP 有快取驗證規則,該規則將防止合規的快取重新使用可能被你的請求改變的回應。
唉,當成功的表單處理將修改多個資源時,那么你必須選擇(每個請求只能有一個請求目標)。
當然,表單提交只是一個例子。所有不安全的請求(POST/PUT/PATCH等)共享相同的快取驗證規則。
我如何撰寫查詢,以便根據所提供的引數在其陣列中的存在情況來過濾資源?
你不需要過濾資源;你需要獲取一個資源,其表示方法是由你想要的約束條件過濾的串列。
/user-discussions?userId=12345
這是一個完美的資源識別符號,其表示方法是與用戶12345相關的討論串列。 您如何獲得該表示法是一個實作細節 - 網路并不關心。
一個常見的例子是,從查詢字串中提取 userId,然后將其作為準備陳述句中的一個引數。
使用查詢字串并沒有什么神奇之處(盡管它在網路上很方便,因為我們可以使用表單讓用戶提供一個 userId 值);讓 id 成為路徑的一部分也是可以的。
URI 設計(具體而言,URI 的起源形式)是為了確定哪些人關心你的識別符號的拼寫,并在他們不同的關注點之間進行權衡(制作你的檔案的作者與閱讀網路日志的操作員的關注點不盡相同,而這些人與閱讀其瀏覽器歷史的客戶也不盡相同,等等)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/309955.html
標籤:
