20

我有一个普通的基本 REST api,例如:

/
    GET - list
    POST - create

/<id>
    GET - detail
    PUT - replace
    PATCH - patch
    DELETE - delete

当 POST 进入时/,我通常会创建一个对象并创建一个新 id。某些(一个)字段(是)要求是唯一的。因此,带有此类重复数据的 POST 可能会导致:

  1. 500 - 完整性错误
  2. 使其更像PUT/PATCH/<id>更新现有记录
  3. 捕捉/避免错误并返回某种4XX
  4. 还有一些我没有想到的。

1似乎:这个请求要么不好,要么我可以处理。处理这种情况的正确方法是什么?

4

2 回答 2

27

@StevenFisher 是正确的。409 冲突是正确的响应。

由于与资源的当前状态冲突,无法完成请求。仅在预期用户可能能够解决冲突并重新提交请求的情况下才允许使用此代码。响应正文应该包含足够的信息让用户识别冲突的来源。理想情况下,响应实体将包含足够的信息供用户或用户代理解决问题;但是,这可能是不可能的,也不是必需的。

例如,一个 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>

注意:需要创建适当的媒体类型以配合上述内容,这将解释超媒体控件的结构(包括表单上的错误属性)并定义各种元素名称的含义(例如,用户,用户名、密码等)。

于 2012-09-30T12:44:56.353 回答
2

#3 更合适。5xx 错误是指服务器出现问题。4xx 错误是指请求出现问题。在这种情况下,请求是错误的,因此 4xx 更合适。400 或 409。

或者你可以做#2,真的取决于上下文。

于 2012-09-30T04:21:20.077 回答