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

时间:2014-09-17 07:56:44

标签: rest http hateoas

假设我们在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看起来相同。

3 个答案:

答案 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 definitionsHTTP status code definitionsURI RFC。这些是REST的基础知识。