Restful API - 它需要多接近get、put、post、delete操作?

3
我已经在Spring中设置了一个API,客户端可以指定要接收的对象的ID。它使用@ResponseBody注释返回对象的JSON列表。但由于请求可能是一个长列表,所以我将其设置为POST,以一个名为ProductRequest的对象(使用@RequestBody注释)接收。这似乎不符合官方REST API标准,因为POST是用于创建新对象的,但这样实现似乎更好,因为您不会在URL中混杂一堆ID。另外,我可以指定其他参数来自定义输出。我的问题是,这可以被认为是有效的RESTful设计吗?Post没有用于创建对象,所以它不严格符合RESTful。你有什么想法呢?

你所说的“官方REST API标准”是指哪个? - jschnasse
如果可能的话,您可以指定自己的HTTP动词,例如LIST。但这并不总是最好的选择。在此处找到了一个简短的讨论:https://www.safaribooksonline.com/library/view/restful-web-services/9780596809140/ch01s12.html - jschnasse
3个回答

1
这是一个简单的GET请求。
@GetMapping(path = "/your-url")
public List<Object> method(@RequestParam(name="ids") List<Long> objectIds) {
}

你可以将列表作为简单的Java列表接收。
/api?ids=1,2,3

问题:如果您的ID列表由数百或数千个12位标识符组成,那么会不会溢出URL字符串的最大允许值?我以前遇到过这种情况。此外,为什么将其设为“post”是一件坏事?最终,在这种情况下,这就是API的工作方式。 - Jack BeNimble
1
我认为这种请求需要在客户端进行分页处理,并且不要在一个请求中请求超过“固定”数量的对象。 但如果不可能的话,我想你不能使用HTTP GET方法。 - Bogdan Oros

1
“那样会不会超出URL字符串的最大允许值?”
实际上,URI长度没有限制。但是,在实践中,您可能会遇到一些限制。
根据RFC7230(我强调),
“HTTP不对请求行的长度设置预定义限制,如第2.5节所述。接收到比其实现的任何方法更长的方法的服务器应该使用501(未实现)状态代码进行响应。接收到比要解析的任何URI都长的请求目标的服务器必须使用414(URI太长)状态代码进行响应。”
“在实践中找到了各种特定限制请求行长度的限制。建议所有HTTP发送者和接收者支持至少8000个八位组的请求行长度。”
它明确表明,在处理您的问题时,我们不能依赖请求行。
“这是否可以被视为有效的RESTful设计?”
由于上述限制,使用 POST 是一个有效的解决方法。
正如 这篇维基百科文章 所述,

这些问题的常见解决方案是使用 POST 而不是 GET 并将参数存储在请求体中。请求体的长度限制通常比 URL 长度限制高得多。

为了完全消除您的犹豫,有一个 常见的非标准头部 X-Http-Method-Override。它要求 Web 应用程序使用头部中给定的方法覆盖请求中指定的方法:
X-Http-Method-Override: GET

我不确定Spring是否处理头信息。但是,它有HiddenHttpMethodFilter过滤器,似乎可以执行类似的工作。


1
你可以通过 HTTP POST 请求来“获取”资源。有一些非常有效的例子可以这样做,包括:
  1. GraphQL -- 我们只需在请求正文中发送(POST)一些查询以按我们所需的格式“获取”一些数据

  2. 假设您需要使用用户名和密码进行身份验证才能获取特定数据,则可以将其作为标头发送到 GET 请求中,或者您可以进行 POST 请求以“获取”数据。


据我所知,我们应该使用“GET”方法通过指定“query”参数来获取我们所需的数据格式。如果需要设置将在资源上执行的操作,则首选“POST”。 - Andrew Tobilko
@AndrewTobilko 感谢您的评论... 当涉及多个资源时,仍然是“GET”操作,即使HTTP方法是POST,也没有“副作用”。 - so-random-dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接