【问题标题】:Spring REST - Proper PUT functionality when resource does not already existSpring REST - 资源不存在时的正确 PUT 功能
【发布时间】:2020-05-07 23:35:07
【问题描述】:

我正在使用 Spring 构建一个 REST API 并实现 PUT 功能。我正在尝试处理客户端尝试 PUT 到资源尚不存在的 uri 的场景。在这种情况下,根据 PUT 规范,应在该 ID 处创建一个新资源。但是,由于我使用的 ID 生成策略 (@GeneratedValue(strategy = GenerationType.IDENTITY)),我无法创建 ID 乱序的资源。数据库必须使用下一个可用值。但是,根据 W3 规范 PUT...

如果 Request-URI 不指向现有资源,并且该 URI 能够被请求用户代理定义为新资源,则源服务器可以使用该 URI 创建资源。

如果服务器希望将请求应用于不同的 URI,它必须发送 301(永久移动)响应;然后,用户代理可以自行决定是否重定向请求。

在这种情况下,我不能做这两个。由于 ID 生成限制,我无法在现有 URI 上创建新资源,也无法发送 301 Moved Permanently 响应,因为根据How do I know the id before saving an object in jpa,在实际持久化对象之前不可能知道序列中的下一个 ID。所以我无法告诉客户端要重定向到哪个 URI 才能正确创建新资源。

我想这个问题已经解决了很多次,因为它是标准的 PUT 功能,但是我很难找到任何其他尝试这样做的人。似乎大多数人只是忽略了 PUT 的“创建新资源”部分,而只是将其用作更新。

我想要做的只是继续创建新资源,然后发送 301 Moved Permanently 将客户端重定向到创建资源的真实位置 - 但正如我们在上面看到的,这违反了 PUT 的定义.

有解决这个问题的弹簧方式吗?还是问题没有解决,true 标准做法是根本不允许通过 PUT 创建新资源?

【问题讨论】:

  • 在这种情况下显示错误。

标签: java spring rest spring-mvc put


【解决方案1】:

如果服务器由于请求错误而无法处理请求,则返回 400。

400 错误请求 - 由于明显的客户端错误(例如,格式错误的请求语法、大小过大、无效的请求消息帧或欺骗性请求路由),服务器无法或不会处理请求。

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 2014-04-04
    • 2017-09-18
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2018-08-09
    • 1970-01-01
    相关资源
    最近更新 更多