Rest api设计:使用重复数据创建POST,可能是IntegrityError / 500,什么是正确的?

时间:2012-09-30 04:15:44

标签: api http rest api-design

我有一个正常的,基本的REST api,如:

/
    GET - list
    POST - create

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

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

  1. 500 - IntegrityError
  2. 使其更像PUT / PATCH/<id>并更新现有记录
  3. 抓住/避免错误并返回某种4XX
  4. 我没想到的其他东西。
  5. 似乎

    1:请求要么糟糕,要么我可以处理它。处理这种情况的正确方法是什么?

2 个答案:

答案 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,真的取决于上下文。