gpt4 book ai didi

java - 使用 spring/java 派生类的 RESTful URI 设计和实现

转载 作者:行者123 更新时间:2023-11-30 11:42:18 26 4
gpt4 key购买 nike

假设我们有水果作为基类,苹果和香蕉作为派生子类。我想知道哪些 URI 约定和实现最有意义。这个很简单:

GET /fruits - returns list of all fruits
GET /bananas - returns list of all bananas
GET /apples - returns list of all apples
GET /bananas/new - returns form for creating a new banana

现在,由于 Spring 已经处理了新对象的创建并设置了它的所有参数,因此保存对象的方法归结为:

fruit.persist(); // same for bananas and apples

那么,您将如何设计 url:

POST /fruits - creates a new fruit // as generic URI ... OR
POST /bananas - creates a new banana // same for apples

通用方法的问题似乎是,该方法会将香蕉/苹果保存为水果而不是香蕉/苹果:

@RequestMapping(value = "/", method = RequestMethod.POST)
private String saveFruit(@Valid Fruit fruit, Long basketId) {
Basket basket = Basket.findBasket(basketId);
fruit.setBasket(basket);
fruit.persist();
}

我想不通,尽管我在创建表单中设置了正确的子类(例如调用 GET/bananas/new 时),但如何告诉 spring 应该创建子类:

uiModel.addAttribute("fruit", new Banana());

所以目前我创建了两个公共(public)方法来保存苹果和香蕉

POST /bananas - create a banana
POST /apples - create an apple

这样实现:

@RequestMapping(value = "/", method = RequestMethod.POST)
public String saveBanana(@Valid Banana fruit) {
String basketId = this.saveFruit(fruit);
return "redirect:/basket/edit/" + basketId;
}

不知何故,这并不能满足我保持事物干燥和简单的需要。也因为在编辑水果时我想调用类似的东西

GET /fruits/123/edit - return the edit form of a fruit

然后应呈现哪些表单字段的逻辑由 View 处理。

也可以考虑调用子类 Controller ,例如/bananas/123/edit,它进一步解耦了代码,并且在添加新水果时不需要更改文件。您认为最好的解决方案是什么?

最佳答案

不要让框架支配您的资源设计,这一点非常很重要。 HTTP 对基类或子类一无所知,只知道资源。忘记 Spring 框架,您希望通过资源设计从 HTTP/ReSt 角度获得什么?

如果您倾向于 /fruits/{id} 的唯一原因是为了避免后端重复,那么您的设计是由内部问题驱动的,而不是外部问题。

如果您的 banana 资源在格式化为 JSON 时与 apple 资源具有不同的表示(例如新布局、不同的属性等),那么恕我直言,它可能值得用它自己的资源来处理。

一旦做出决定,然后看看如何使用 Spring 尽可能干净地完成它。

关于java - 使用 spring/java 派生类的 RESTful URI 设计和实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11795478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com