如果id不存在,应该为http put请求返回什么?

厕所:

我正在构建宁静的Web服务。对于放置请求,我首先在pathvariable中找到具有id的testBean。如果它不存在,那么我创建一个新的。我想知道在这里创建一个新文件是否正确,否则我应该抛出异常。因为id是自动递增的,所以如果我创建一个新的TestBean,则保存在数据库中的id与url path参数中的ID是不同的。

@PutMapping("/Test/{id}")
   public TestBean updateTestBean(@PathVariable long id, @RequestBody TestBean newTestBean) {
      return testBeanService.getTestById(id)
         .map(testBean -> {
            testBean.setBRR(newTestBean.getBRR());
            testBean.setModifiedDate(newTestBean.getModifiedDate());
            return crewsBeanService.saveTestBean(testBean);
         })
         .orElseGet(() -> {
            newTestBean.setId(id);
            return testBeanService.saveTestBean(newTestBean);
         });
   }
prakashb:

我总是喜欢保持PUT方法幂等。幂等性可以解释为您执行某个“操作”多少次,其结果将与第一次相同。由于REST只是一种样式,因此它取决于您,但是我总是会问我,将操作保持为PUT还是POST是否有意义。

如果您的服务的客户不耐烦并且在服务第一个请求时多次访问您的PUT服务,该怎么办?您可能最终创建了两个用户。因此,如果ID不存在,则引发异常是有意义的

可以是400或404,我不喜欢404,但更喜欢400,原因如下:

1)如果资源错误或它们使用的ID错误,则会混淆您的API的客户端。
(您总是可以区分错误响应并提供有意义的信息,但是我不喜欢!)

2)通过使用404,

您是在告诉用户问题可能是永久性或临时性的

,例如,假设您的服务未在发现服务器(eureka)中正确注册或崩溃,发现服务器将发送404,直到您解决问题为止。

通过使用400,

您要求用户尝试使用不同的输入(在这种情况下,使用不同的ID)。这是永久的...

正如您所说的,id是自动递增的,并且客户端无法确定该值,因此,直到用户通过返回并要求您的POST服务提供新ID来解决问题之前,该请求为“ BAD”并且无法处理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果HTTP PUT不存在,应该创建一个资源吗?

如果要求的密钥不存在,应该抛出什么异常?

插入(如果不存在),否则返回id

获取文档ID(如果存在)或将其插入,并返回插入的文档ID(如果不存在)

MySQL请求如果不存在

如果文件不存在,则返回失败

如果值不存在,则返回null

如果变量不存在则返回 false

如果指定的字段不存在,cut返回什么?

如果文件不存在,readAllLines将返回什么?

yii2保存,检查是否存在,如果是,则返回ID,如果不存在,则创建(并返回ID)

如果文件不存在,akka http 路由 HttpEntity.fromFile 返回 403

插入表(如果不存在)并在两种情况下都返回ID

MySQL-插入值(如果不存在)或更新并返回ID

Postgres,如果表中不存在 id,则返回默认行

如果行ID不存在,则返回一个字符串

使用Python和Selenium进行抓取-如果元素不存在,我应该如何返回“ null”

如果 DB 中不存在针对特定列的值,那么状态代码应该是什么?

如果请求的字段不存在,则正确的REST响应

SQL为从另一个表返回的每个ID插入多行,如果该ID不存在该行

为什么在Amazon SDK中请求不存在的文件的预签名URL会返回URL?

如果日期不存在,则返回min(DATE)

如果与给定属性不存在关系,则返回?

ActiveModelSerializer:如果关联不存在,则返回nils的对象

如果OpenStruct中不存在键,如何返回nil?

访问dict键,如果不存在,则返回None

Postgres:如果不存在则插入,否则返回该行

如果键不存在,则字典返回默认值

如果行不存在,QueryRow()。Scan()返回错误