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

具有不同HTTP请求类型的两个相同REST映射,rest,http,hateoas,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.ACCEPT

假设在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看起来完全相同

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


对于该节目,您可以在URL中添加一个
/view/
,但这并不是必需的,但对于编辑,我个人更希望URL是自解释的

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


对于该节目,您可以向URL添加一个
/view/
,但这并不是真的必要,但对于编辑,我个人更希望URL是自解释的

就REST API设计而言,您的映射是正确的。对于给定的资源,您应该通过单个URI与之交互,在您的示例中:

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

并通过HTTP谓词指定操作


例如,检查中的
restfulapi HTTP方法

就RESTAPI设计而言,您的映射是正确的。对于给定的资源,您应该通过单个URI与之交互,在您的示例中:

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

并通过HTTP谓词指定操作


例如,检查中的
restfulapi HTTP方法

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

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

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


REST非常简单。它使用现有标准来描述统一接口。遗憾的是,大多数web开发人员都不知道这一点。你至少应该读,和。这些是REST的基础。

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

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

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


REST非常简单。它使用现有标准来描述统一接口。遗憾的是,大多数web开发人员都不知道这一点。你至少应该读,和。这些是REST的基础。

您能提供一个http方法重写的简单示例吗?我知道这是关于用POST请求请求资源的,但是在请求的主体中我们指定了“REAL”方法(在这种情况下是PUT/PATCH?我不知道我们应该如何处理该请求(在Spring MVC中)。您能提供一个http方法重写的简单示例吗?我知道这是关于使用POST请求请求资源,但在该请求的主体中,我们指定了“REAL”方法(在本例中为PUT/PATCH?我不知道我们应该如何处理该请求(在Spring MVC中)。