假設我們有兩個物體。Userentity 可以有很多offer,并且Offer必須有一個User。
class User {
...
@OneToMany(mappedBy = "user", orphanRemoval = true)
private Set<Offer> offers;
}
class Offer {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fk_user")
private User user;
}
此時有兩個控制器。UserController和OrderController. 被UserController映射在下/api/v1/users/并且OrderController被映射在 下/api/v1/orders/。
- 獲取用戶報價串列的端點應該是什么樣的?
- 它應該在同一個控制器中嗎?我確實有按功能專案結構。
- 如何修改或洗掉
Offer特定的User?如果我們必須/api/v1/users/{username}/offers/{offerId}洗掉或更新報價,我們是否還應該有/api/v1/offers/{offerId}允許編輯或洗掉報價的端點?也許值得管理員使用它?
uj5u.com熱心網友回復:
我在創建端點時使用的一般經驗法則是:
- URL 需要干凈且易于理解
- 它們應該盡可能短,同時仍然提供資訊。
- 嘗試以允許您在合理數量內重復使用它的方式構建它
- 考慮用戶體驗(無論是從瀏覽器還是移動應用程式等呼叫)
我不確定是否有明確的書面規則應該如何構建 URL。在您的特定情況下,我/users/{username}/offers/{offerId}只會在這是您公開和使用優惠的唯一地方時使用,因為您是按功能分離代碼。
如果您對 offer 有任何進一步的邏輯和/或有具有此類邏輯的 bean,我將為 Offers 創建一個單獨的控制器,該控制器位于/offers. 關于你的最后一個問題。這在很大程度上取決于您要達到的目標。如果您需要能夠更新/洗掉/創建優惠,那么擁有這樣的功能是有意義的。即使它只是由管理員使用。您可以限制對端點的訪問。如何做到這一點取決于您授權用戶的方式以及您擁有的關于他們的資訊。大多數人使用角色。
如果您決定擁有完整的 CRUD 功能,我建議您使用單個路徑和請求方法的組合。
我個人會創建以下內容:
@RestController
@RequestMapping(value = "/users")
class UserController {
@GetMapping("{userId}/offers")
public Set<Offer> getAllOffers(@PathVariable("userId") String userId){
...
}
@GetMapping("{userId}/offers")
public Offer getOffer(@PathVariable("userId") String userId, @RequestParam(required = true) String offerId){
...
}
@PutMapping("{userId}/offers")
public Offer createOffer(@PathVariable("userId") String userId, @RequestBody Offer offer){
...
}
@PostMapping("{userId}/offers")
public Offer updateOffer(@PathVariable("userId") String userId, @RequestBody Offer offer){
...
}
@DeleteMapping("{userId}/offers")
public void deleteOffer(@PathVariable("userId") String userId, @RequestParam(required = true) String offerId){
...
}
}
在這種情況下,我認為創建和更新的 POST/PUT 會更干凈,因為不會有重復的資訊。準確地說是ID。
uj5u.com熱心網友回復:
我同意它應該在同一個“用戶控制器”中,這是有道理的,因為優惠屬于用戶,所以有一個像這樣的端點:
@GetMapping("{user}/offers")
public Set<OfferDTO> getOffers(@PathVariable("user") String user) {
return offerService.getOffers(user);
}
例如,如果您想在串列中顯示它們,您可以定義特殊的 DTO 來從報價中獲取元資料,并且您可以將它們作為串列顯示給您的用戶。
您可以設定一個類似的端點來更新報價,它可以是一個 POST 端點,以及一個用于洗掉的 DELETE 端點。您可能想考慮如果用戶在您洗掉某個商品時正在查看它會發生什么,例如在后臺執行緒中創建一個用于洗掉商品的異步任務并更新 UI 以通知用戶該商品已被洗掉。
Spring 有一些非常好的安全注釋(檢查this和this),您可以為管理員端點撰寫自己的注釋:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@PreAuthorize("hasAuthority('" ROLE_ADMIN "')")
public @interface IsAdmin {}
然后像這樣注釋您的方法:
@DeleteMapping("/{user}/{offer}/delete")
@IsReceiverAdmin
public void delete(@PathVariable("user") String user, @PathVariable("offer") String offer){
return offerService.delete(user, offer);
}
當然,服務層的實作非常重要,但它可以像呼叫你的存盤庫并在那里執行操作一樣簡單:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/418567.html
標籤:
