我有一个正常的,基本的REST api,如:
/
GET - list
POST - create
/<id>
GET - detail
PUT - replace
PATCH - patch
DELETE - delete
当POST进入/
时,我通常会创建一个对象并创建一个新ID。某些(一个)字段必须是唯一的。因此,具有此类重复数据的POST可能会导致:
PUT
/ PATCH
至/<id>
并更新现有记录4XX
1
:请求要么糟糕,要么我可以处理它。处理这种情况的正确方法是什么?
答案 0 :(得分:17)
@StevenFisher是对的。 409 Conflict是正确的答案。
由于与当前的冲突,请求无法完成 资源的状态。此代码仅在以下情况下允许 预计用户可能能够解决冲突 重新提交请求。响应机构应该包括足够的内容 用户识别冲突根源的信息。 理想情况下,响应实体将包含足够的信息 用户或用户代理来解决问题;但是,这可能不是 可能而且不是必需的。
例如,GET on /可能会告诉客户他们可以按如下方式创建用户
HTTP/1.1 200 OK
<users href="/">
<create href="/" method="post">
<username type="xs:token" cardinality="required"/>
<password type="password" cardinality="required"/>
</create>
... other hypermedia controls, like search ...
</users>
遵循超媒体控制并尝试使用用户名“Skylar Saveland”创建用户可能会导致
HTTP/1.1 409 Conflict
<users href="/">
<create href="/" method="post">
<username type="xs:token" cardinality="required"
error="The username 'Skylar Saveland' is already taken. Please select another username"/>
<password type="password" cardinality="required"/>
</create>
... other hypermedia controls, like search ...
</users>
同样,尝试创建没有密码的用户可能会导致
HTTP/1.1 409 Conflict
<users href="/">
<create href="/" method="post">
<username type="xs:token" cardinality="required"/>
<password type="password" cardinality="required"
error="A password must be specified"/>
</create>
... other hypermedia controls, like search ...
</users>
或者您可能有多个错误,例如,
HTTP/1.1 409 Conflict
<users href="/">
<create href="/" method="post">
<username type="xs:token" cardinality="required"
error="The username 'Skylar Saveland' is already taken. Please select another username"/>
<password type="password" cardinality="required"
error="A password must be specified"/>
</create>
... other hypermedia controls, like search ...
</users>
注意:一个适当的media type will need to be created与上面一起,它将解释超媒体控件的结构(包括表单上的错误属性)并定义各种元素名称的含义(例如,用户) ,用户名,密码等)。
答案 1 :(得分:1)
#3更合适。 5xx错误是指服务器出现问题。如果请求出现问题,则会出现4xx错误。在这种情况下,请求是错误的,因此4xx更合适。 400或409。
或者你可以做#2,真的取决于上下文。