具有不同HTTP请求类型的两个相同REST映射



假设REST控制器上有两个方法:

@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/{userId}", method = RequestMethod.GET)
@ResponseBody
public UserDTO showUserDetails(@PathVariable("userId") Long userId) {
/* code here */
}
@ResponseStatus(HttpStatus.ACCEPTED)
@RequestMapping(value = "/{userId}", method = RequestMethod.POST)
@ResponseBody
public UserDTO editUser(@PathVariable("userId") Long userId, UserDTO userToEdit) {
    /* code here */
}

因此,我们有两个相同的URI映射,但支持不同的HTTP请求我的问题是:在设计API方面,这种方法可以接受吗或者最好将第二个方法映射到类似/{userId}/edit的方法?

此外,当使用hateoas范式时,响应看起来有些奇怪:

"links":[{"rel":"self","href":"http://1localhost:8080/root/users/1"},{"rel":"edit","href":"http://localhost7:8080/root/users/1"}]

两个不同的URI看起来完全相同。

在REST API设计方面,映射是正确的。对于给定的资源,您应该通过一个URI与之交互,例如:

http://localhost:8080/root/users/1

并通过HTTP谓词指定操作。

例如,请查看REST-Applied to web services中的RESTful API HTTP methods

我肯定会更改请求映射。对于你的editUser,我会添加一个/edit/,这样你的URL就会看起来像http://localhost7:8080/root/users/edit/1

对于该节目,您可以在URL中添加/view/,但这并不是真正必要的,但对于编辑,我个人更希望URL是不言自明的

从REST的角度来看,重要的是使用正确的HTTP方法,并且单个资源标识符(URL)仅映射到单个资源。URL结构无关紧要。它只对你重要,通过路由请求。

你选择的方法不好。通过编辑,您必须使用PUT(完整)或PATCH(部分)而不是POST。如果由于某些原因(例如,使用纯HTML表单发送请求)而无法使用这些方法,则应该使用方法重写。例如,在_method参数、正文、查询或标头中发送真实方法。(你选择哪一个并不重要,因为这已经是一个糟糕的解决方法了。大多数人更喜欢查询。)

通过选择URL,大多数人更喜欢只使用名词。这是因为您没有将URL映射到操作(如SOAPRPC),这些操作是动词(可能还有名词)。例如POST /GetCurrentPrice。您可以将URL映射到web资源,这些资源是名词,例如GET /currentPrice

REST非常简单。它使用现有的标准来描述统一的接口。遗憾的是,大多数web开发人员都不知道HTTP标准。您应该至少阅读HTTP方法定义、HTTP状态代码定义和URIRFC。这些是REST.

的基础

最新更新