3 回答

TA貢獻1839條經驗 獲得超15個贊
最好的方法是保留id在您的RequestVODTO 本身中,而不是像您已經建議的那樣保留在 URL 中,因為即使 URL 中有 100 個 id 也會使您的 URL 非常大,而您正在談論 10K id。
并且在未來,單個的比特長度id可能會增加,或者稍后您可能需要更新 50k 甚至 100K 的對象。
根據URL 的最大長度,沒有對 URL 長度的一般規范,但過長的 URL 通常是錯誤的,超過 2,000 個字符的 URL 在大多數流行的 Web 瀏覽器中將無法正常工作。
所以我認為你的第二種方法在這里是最好的,并且對未來的目的也有好處。
您可能還想使用PUT請求,因為它對更新請求更有意義。所以你的代碼會變成這樣:
@PUT
@Path("/update")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public ResponseVO updateBlockReason(List<RequestVo> requestVo) {

TA貢獻1848條經驗 獲得超6個贊
我發現路徑product/{id}/update
有問題,因為您可以通過映射@Put-request
到product/{id}
自身來實現類似的行為。READ、WRITE 區分已經通過請求映射明確顯示。此外,是否在 restful url 中使用動詞本身就是一個話題。
假設您可以使用多個端點,這可能看起來像/products/{id}
.
因為你想批量/批量更新產品,你可以映射@Put-requests
到/products
現在,在 RequestBody 中有更新的產品列表。請記住,這會使響應變得有些復雜,因為您可能必須返回Http-207
以回答列表中每個元素更新的正確狀態。
我想要 1 個邏輯端點進行更新
您可以為此使用邏輯服務方法,但實際上沒有端點。/{id}
您已經提到了批量更新路徑中的問題。如果你真的,真的需要,我會刪除 -mapping@Put
并/products/{id}
重定向到/products
更新內容將是單個元素列表的位置,或者更復雜一點,由 mediaType 區分(再次意味著兩個端點,但單個 url ).
編輯:我只是碰巧了解了 VO 問題。您不是在更新產品,而是在更新產品的一部分(名稱 RequestVO 誤導了我)。對我來說,這聞起來像@Patch-mapping
一個產品的某些部分得到更新的地方。所以我仍然會使用/products
但帶有@Patch-mapping
.
當客戶端需要完全替換現有資源時,他們可以使用 PUT。當他們進行部分更新時,他們可以使用 HTTP PATCH。
這帶來了另一個問題,@Post
僅在 id 未知時使用(通常在創建某些內容并分配 id 之前,用于更新使用@Put
和重用分配的 id)使用 post 在技術上是可行的,但由于idempotece不可取。

TA貢獻1942條經驗 獲得超3個贊
為什么不將請求正文中的 ID 列表作為 JSON 數組傳遞?代碼將是:
@POST
@Path("/update/ids")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public ResponseVO updateBlockReason(@RequestBody List<Integer> ids, List<RequestVo> requestVo) {
...
}
添加回答
舉報