API PUT端点是否应该接收所有参数,即使它们不可编辑?

时间:2019-08-19 08:53:49

标签: rest api microservices

后端数据库中有一个名为Car的对象。它包含几个字段:

id
name
age
vinNumber
retailerId

还有一个API可以提高汽车的添加和编辑:

POST /car - creates a car
PUT /car/{carId} - updates a car

API的用户可以在POST正文中创建汽车时提供姓名,年龄和vinNumber。

更新汽车时,用户可以编辑姓名和年龄。创建汽车后,无法编辑VinNumber。

retailerId也不可编辑,因为它是从另一个系统到后端数据库的。

话虽如此,我们有两个不应使用API​​编辑的字段:vinNumber和retailerId。

因此,考虑到REST的幂等性,PUT请求是否应要求还提供GET请求较早收到的API vinNumber和retailerId的用户?尽管这些参数不可编辑?

2 个答案:

答案 0 :(得分:1)

根据PUT请求文档-应该提供完整的数据(也就是vinNumber和retailerId)-https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods

在这种情况下,您可以改用PATCH。

我们最初所做的也是很多次,我看到的是POST / car / {carId}

答案 1 :(得分:1)

要认识的一件事-HTTP规范描述了HTTP请求的语义;此消息是什么意思?它允许由不同组织实现的客户端和服务器进行协作,而无需两者之间的直接伙伴关系。

关键是通用客户端可以为通用服务器准备请求,而无需带外信息。

PUT从语义上是请求服务器更改其当前资源表示形式以匹配客户端的本地副本。

如果“服务器”只是一个贫乏的数据存储(文件系统或文档数据库前面的立面),那么在服务器上PUT的作用就是将消息正文原样写入存储。

REST和统一接口的要点是,您的服务器应始终以与贫乏的正面理解它们相同的方式理解消息。

类似地,您的服务器应对其响应使用相同的共享语义。

如果您正在使用的表示形式包括vinNumber和retailId,则客户端应发送这些字段,除非请求完全将其从表示形式中删除(取决于是否允许将它们从表示形式中删除)必填)。

服务器应了解缺少这些字段的请求正在尝试删除它们,而那些字段中具有新值的请求正在尝试更改它们。然后,它可以决定要处理该请求,然后发送相应的响应。

Roy Fielding用2002写了关于GET语义的文章:

  

HTTP不会尝试要求GET的结果是安全的。该操作要求操作的语义是安全的,因此,如果发生任何导致财产损失的结果(钱,BTW,为了这个定义,它被视为财产。)

PUT(以及其他HTTP方法)也是如此。如果请求的处理方式与语义不匹配,我们将负责使该实现方式承担财产损失的责任。