簡體   English   中英

REST 如何在沒有完整實體的情況下發布或放置(@RequestBody)

[英]REST how to POST or PUT without full entity(@RequestBody)

我有一個具有以下字段的實體“投票”:

private Integer id;
private LocalDate date;
private LocalTime time = LocalTime.now();
private User user;
private Restaurant restaurant;

我知道對於 REST POST 最好我應該使用這樣的資源模式:

/votes

並在更新的情況下:

/votes/{voteId}

大概我應該在我的 controller 從前端收到全票實體,如下所示:

@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Vote> create(@RequestBody Vote vote)

但我不需要它來創建或更新該實體,我只需要這樣的 restaurantId:

@PostMapping
public void create(@RequestParam int restaurantId) {
        voteService.create(SecurityUtil.getUserId(), restaurantId);
    }

那么,使用這樣的資源模式是正確的選擇,還是我錯了?

對於 POST 創建:

/votes?restaurantId=10

對於 PUT 更新:

/votes/{voteId}?restaurantId=10

您應該將其更改為:

@PostMapping
public void create(@RequestParam("restaurantId") int restaurantId) {
    voteService.create(SecurityUtil.getUserId(), restaurantId);
}

您應該在 @RequestParam("param_name") 中提及參數名稱

為什么不使用路徑參數? 將 get 參數傳遞給 POST 和 PUT 有點奇怪。

@PostMapping("/{restaurantId}")
public void createPost(@NonNull @PathVariable(value = "restaurantId") String restaurantId) {
    voteService.create(SecurityUtil.getUserId(), restaurantId);
}

@PutMapping("/{restaurantId}")
public void createPut(@NonNull @PathVariable(value = "restaurantId") String restaurantId) {
    voteService.create(SecurityUtil.getUserId(), restaurantId);
}

那么,使用這樣的資源模式是正確的選擇,還是我錯了?

“這取決於”。

URI 的拼寫與機器無關。 /0d905ca3-c848-4bc5-bc4a-658fbec88ab5是一個非常好的使用路徑。 人類可讀的拼寫只是對人類的一種便利——像/votes之類的“RESTful”拼寫與使用 UUID 相比不再是 REST,但是當操作員翻閱日志試圖識別流量模式時,他們可能會更高興第二個選擇。

POST,作為方法標記,很好。 請參閱使用 POST 沒問題(菲爾丁,2009 年)。

但是, PUT聽起來並不像您想要的那樣。 從語義上講, PUT的意思是“用當前消息的有效負載替換資源的當前表示”。 這是一種遠程創作方法,與GET搭配使用時,可為您提供文檔存儲:

例如, PUT是您將在全球范圍內使用 web 來編輯您的主頁的方法。

GET /home-page

(make changes locally)

PUT /home-page

該 PUT 請求的正文是主頁的預期新版本。

在你的情況下:

PUT /votes/{voteId}?restaurantId=10

應該有一個有效載荷,看起來就像你讀到的那樣

GET /votes/{voteId}?restaurantId=10

它需要是資源的完整表示。

並不意味着它需要是實體的完整表示; 資源是文檔的概括; 查看您的實體數據。 遠程創作發送視圖的新表示,並且對實體進行匹配更改是服務器的工作。 參見2011 年的吉姆·韋伯

如果您不想以這種方式進行更新,那很好——但是您不應該使用PUT ,因為這違背了與所有其他資源具有共同語義的意義(您應該使用 POST)。

暫無
暫無

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

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