RESTful在这种情况下应该怎么设计?

发布于 2021-12-04 16:53:18 字数 685 浏览 841 评论 15

根据RESTful的理念,比如我对订单对象进行RESTful风格的API设计如下:

GET: /order 列出所有订单

POST: /order 创建一个订单

PUT: /order/ID 更新一个订单(全部信息)

PATCH: /order/ID 更新一个订单(部分信息)

现在有这样的应用场景:订单的价格会有修改,订单的状态会有修改,但是这些修改是需要一定条件的(比如订单状态是10的时候才能修改订单状态为20)。那么我的Controller和Action应该怎么设计呢?

比如现在要更新订单价格,我应该调用的是 PATCH: /order/ID,然后请求时携带的json数据是一个封装好的Order对象,服务器接到json数据后,转换成Order对象。但是我怎么知道这个动作是要修改订单价格的呢?因为如果修改订单价格是需要做一些判断的。

如果是更新订单状态呢?我怎么去区分具体是更新什么内容呢?

我应该将修改订单价格和修改修改状态的操作分别设计成不同的Controller中的Action呢,还是就一个统一的 update Action呢?

或者哪位大侠有设计比较好的RESTful范例给我看看,弄不太明白了。RESTful在设计上避免动词,而以前写Controller的时候就是按照action动作来写的,思路有点转变不过来啊!

跪求高手啊!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(15

伪装你 2021-12-08 13:24:12

我觉的啊,,,知道了get,put,post做什么样的事情就可以了,,,,多写几个修改的controller最好了,万能接口万能controller什么的最讨厌了。。。。

不乱于心 2021-12-08 13:24:11

楼下正解.

如日中天 2021-12-08 13:24:08

送你一张图, 也许你就懂了

根据对应的情况, 写多个controller 方法就好了. 打个比方

   @RequestMapping(value = "order",method = RequestMethod.GET)
    public void getOrder(){
        // ....
    }
    @RequestMapping(value = "order",method = RequestMethod.POST)
    public void postOrder(){
        // ....
    }
    @RequestMapping(value = "order/{orderId}",method = RequestMethod.PUT)
    public void putOrder(String orderId){
        // ....
    }
    @RequestMapping(value = "order/{orderId}",method = RequestMethod.PATCH)
    public void pathOrder(String orderId){
        // ....
    }

伪代码,参数神马的,自己折腾下... 

不知道是不是我理解错你的意思了= =;;; 

终陌 2021-12-08 13:24:08

引用来自“Nick_路”的评论

送你一张图, 也许你就懂了

根据对应的情况, 写多个controller 方法就好了. 打个比方

   @RequestMapping(value = "order",method = RequestMethod.GET)
    public void getOrder(){
        // ....
    }
    @RequestMapping(value = "order",method = RequestMethod.POST)
    public void postOrder(){
        // ....
    }
    @RequestMapping(value = "order/{orderId}",method = RequestMethod.PUT)
    public void putOrder(String orderId){
        // ....
    }
    @RequestMapping(value = "order/{orderId}",method = RequestMethod.PATCH)
    public void pathOrder(String orderId){
        // ....
    }

伪代码,参数神马的,自己折腾下... 

不知道是不是我理解错你的意思了= =;;; 

挽清梦 2021-12-08 13:24:06

 /order/ID/price

剑心龙吟 2021-12-08 13:23:43

怎么判断啊?检测Json对象的属性值吗?这样的话这个action的判断就太多了,因为order很多属性都是可以修改的,难道每个都要判断吗?

狼亦尘 2021-12-08 13:23:25

引用来自“酱哥哥”的评论

  • GET(SELECT):从服务器取出资源(一项或多项)。
  • POST(CREATE):在服务器新建一个资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
  • DELETE(DELETE):从服务器删除资源。

了解了规范,你就应该知道如何去处理你需要处理的数据了。PATCH修改个别属性,当然就只传需要修改的字段

南冥有猫 2021-12-08 13:22:51
  • GET(SELECT):从服务器取出资源(一项或多项)。
  • POST(CREATE):在服务器新建一个资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
  • DELETE(DELETE):从服务器删除资源。

了解了规范,你就应该知道如何去处理你需要处理的数据了。PATCH修改个别属性,当然就只传需要修改的字段

奈何桥上唱咆哮 2021-12-08 13:22:03

首先,你理解的对了,其次,发现你又纠结又古板。你可至于针对每个字段都做个修改的方法?如果一次性修改2个参数或者3个参数呢?好了,不说了,controller怎么实现是你的事情了。

狼亦尘 2021-12-08 13:21:46

非常感谢你的耐心解答,是啊,我的确是有些古板和纠结,性格缺陷啊,呵呵。不过你能这么耐心给我解答,看来你是个很好的老师。非常感谢。我再琢磨琢磨,我学东西比较慢,理解的也慢,我一般都是反复练习,反复琢磨才能学会,不好意思啊。

嘦怹 2021-12-08 13:21:43

引用来自“酱哥哥”的评论

  • GET(SELECT):从服务器取出资源(一项或多项)。
  • POST(CREATE):在服务器新建一个资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
  • DELETE(DELETE):从服务器删除资源。

了解了规范,你就应该知道如何去处理你需要处理的数据了。PATCH修改个别属性,当然就只传需要修改的字段

清风夜微凉 2021-12-08 13:20:57

我的意思是,客户端传来的值是不确定的,有可能是订单的状态,有可能是订单的价格,我怎么去区分啊?因为同一个url最后进入的是同一个Controller中的同一个action啊

路还长,别太狂 2021-12-08 13:11:30

回复
带一些标识数据过来区分啊。还有,去看一下 Restful 的那篇论文,绝对的 Restful 在现阶段是没有办法实现的,很多时候都要折中。

长安忆 2021-12-08 12:28:04

回复
显然传递过来的键必须是规范的才行。

滥情空心 2021-12-06 13:14:44

引用来自“酱哥哥”的评论

  • GET(SELECT):从服务器取出资源(一项或多项)。
  • POST(CREATE):在服务器新建一个资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
  • DELETE(DELETE):从服务器删除资源。

了解了规范,你就应该知道如何去处理你需要处理的数据了。PATCH修改个别属性,当然就只传需要修改的字段

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文