我将使用什么Http方法来修改此REST资源以及我要返回哪些响应代码?

时间:2017-01-06 15:13:16

标签: spring spring-mvc spring-restcontroller

我是RESTful网络服务的新手,我有以下疑问。我正在开发一个Spring MVC应用程序(但这并不重要,因为我的疑问与REST概念更相关)。

我有这个域类:

@Entity
@Table(name = "accomodation_media")
public class AccomodationMedia {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    //@Column(name = "accomodation_fk")
    //private Long idAccomodation;

    @ManyToOne
    @JoinColumn(name = "accomodation_fk", nullable = false)
    private Accomodation accomodation;

    @Column(name = "is_master")
    private boolean isMaster;

    @Lob
    @Column(name = "media")
    private byte[] media;

    private String description;

    private Date time_stamp;

    .................................................................
    .................................................................
    GETTER AND SETTER METHODS
    .................................................................
    .................................................................
}

表示记录到我数据库的 room_media 表中。

然后我有一个处理HTTP Requesto的控制器方法: / Accomodation / {accomodationId} / accomodationMedia / {mediaId}

这样的事情:

@RequestMapping(value = "/{accomodationId}/accomodationMedia/{newMasterImgId}", method = RequestMethod.XXXX)
public ResponseEntity<String> changeMasterImg(@PathVariable Long accomodationId,
                                              @PathVariable Long newMasterImgId) throws Exception {

    accomodationMediaService.changeMasterImg(accomodationId, newMasterImgId);

    return ResponseEntity.ok("Master Image cambiata");

}

此方法调用 changeMasterImg(),它基本上从数据库中检索 AccomodationMedia 实例,更改 isMaster 字段的值并更新它

所以基本上这个方法处理部分更新,因为它现在插入一个全新的对象,但检索一个对象,修改它并更新它。

所以我怀疑是:

1)根据 RESTful 标准,我是否需要使用 POST 作为更新 AccomodationMedia 资源的请求?我已经读过,也许我也可以使用 PATCH 进行部分更新。使用 POST PATCH Http方法有什么区别?在这种情况下最好的是什么?

2)如果成功更新,我将返回什么样的状态代码响应?这里: Best practice for partial updates in a RESTful service

它说 303 303 应该是重定向消息而不是 200 这意味着操作没问题?

2 个答案:

答案 0 :(得分:2)

作为一般规则,CRUD操作应遵循以下模式:

POST: Create
PUT: Update
GET: Read
DELETE: Delete

如果操作成功,我会返回2xx代码。 3xx代码用于重定向,您在此处没有这样做。

如果您返回成功和数据有效负载:200 如果您返回成功而没有内容,则:204

使用REST响应的一个很好的资源:Current Igraph Messy Output

答案 1 :(得分:1)

您还必须考虑PUT HTTP方法。根据{{​​3}}:

  

当您可以通过特定资源完全更新资源时,请使用 PUT 。例如,如果您知道文章位于restcookbook.com,则可以通过此URL上的PUT直接输入本文的新资源表示。

     

如果您不知道实际的资源位置,例如,当您添加新文章但又不知道在哪里存储它时,您可以 POST 它到URL,并且让服务器决定实际的URL。

关于PATCH:

  

HTTP方法 PATCH 可用于更新部分资源。

对于回复状态代码,我更希望http://example.org/article/1234200 OK

除了restcookbook之外,我还推荐201 Created这是权威参考。