假设我们在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"}]
2个不同的URI看起来相同。
答案 0 :(得分:2)
在REST API设计方面,您的映射是正确的。对于给定的资源,您应该通过单个URI与它进行交互,在您的示例中:
http://localhost:8080/root/users/1
并通过HTTP谓词指定操作。
查看REST - Applied to web services中的RESTful API HTTP methods
,以获取示例。
答案 1 :(得分:1)
我肯定会更改请求映射。对于editUser
我添加/edit/
,以便您的网址看起来像http://localhost7:8080/root/users/edit/1
对于该节目,您可以在网址中添加/view/
,但这不是必需的,但对于编辑,我个人更喜欢将网址设为自定义
答案 2 :(得分:1)
从REST角度来看,重要的是使用正确的HTTP方法,并且单个资源标识符(URL)仅映射到单个资源。 URL结构无关紧要。只通过路由请求对您来说很重要。
您选择的方法很糟糕。通过编辑,您必须使用PUT(完整)或PATCH(部分)而不是POST。如果由于某些目的而无法使用这些方法(例如,使用纯HTML表单发送请求),则应使用方法覆盖。例如,在_method参数,正文,查询或标题中发送实际方法。 (你选择哪个并不重要,因为它已经是一个丑陋的解决方法。大多数人更喜欢查询。)
通过选择URL,大多数人只喜欢使用名词。这是因为您没有将URL映射到操作(如SOAP RPC),这些是动词(可能是名词)。例如POST /GetCurrentPrice
。您将URL映射到Web资源,这些名称是名词GET /currentPrice
。
REST非常简单。它使用现有标准来描述统一的接口。遗憾的是,大多数Web开发人员都不知道HTTP standard。您应该至少阅读HTTP method definitions,HTTP status code definitions和URI RFC。这些是REST的基础知识。