首页 文章

POST时数据不正确的HTTP状态(使用不存在的资源的id)

提问于
浏览
2

当我执行POST请求以创建新用户时, correct HTTP status to return 会是什么,但其中一个参数不正确 - 我在数据库中不存在包含用户数据的公司ID .

POST数据:{用户名:'newuser',年龄:99, company_id: 34 }

the company with id 34 does not exist in the database.

我在想是否可能是这样的:

  • 400,一种无效数据,但它是有效但不存在的ID

  • 404 - 但不清楚哪个资源不存在

  • 409,因为它是一种冲突,用户可以通过更改公司ID来解决这个问题

  • 422?

  • 或500 - 因为它是一种数据库错误,而不存在不存在的id

3 回答

  • 2

    404 Not Found 是为 POST 请求返回的有问题的状态 . 它意味着您发送请求的资源不存在;调用者得到的URL错误 .

    最明显(和通用)的答案是: 400 Bad Request

    这只表示您的请求有问题(错误在于调用者而不是服务器),然后表达您的响应正文中出错的具体细节 . 这通常是处理请求验证的方式 .


    理想的答案是通过向他们所属的公司发送请求来添加用户:

    POST /company/34
    Content-Type: application/json
    {
        "username": "newuser",
        "age": 99
    }
    

    这意味着调用者必须找到一个有效的 company 资源来发送请求 . 如果 company/34 不存在,则 404 Not Found 响应是合适的;您尝试将用户添加到不存在的公司 .

    这意味着您的API必须使用资源语义进行结构化,并且用户必须属于一个公司 .

  • 1

    在这里,这张照片非常好,而且我已经多次使用它了 .

    Which code should I return?

    我会选择404.资源可能存在(不是格式错误)但它没有(因此无法找到) .

  • 1

    400或422

    首先,请保持最小值为client error,因此5xx状态代码不适用于此处 . 您应该选择一个4xx状态代码 .

    最明显的选项是400422

    • 如果JSON在语法上无效,则返回400 .

    • 如果JSON在语法上有效但其内容无效,则返回422以指示服务器无法处理请求实体 .

    请参阅RFC 4918中的以下引用(对于您的情况,只需在读取XML时读取JSON):

    11.2 . 422不可处理的实体422(不可处理的实体)状态代码表示服务器理解请求实体的内容类型(因此415(不支持的媒体类型)状态代码是不合适的),并且请求实体的语法是正确的(因此400 (错误请求)状态代码不合适)但无法处理包含的指令 . 例如,如果XML请求主体包含格式正确(即语法正确)但语义错误的XML指令,则可能发生此错误情况 .

    类似的情况在answer中得到了解决 .


    例如,如果有效内容的内容包含无效值(但在语法上有效),GitHub API v3也会返回422

    接收请求主体的API调用有三种可能的客户端错误类型:发送无效的JSON将导致400 Bad Request响应 . [...]发送错误类型的JSON值将导致400 Bad Request响应 . [...]发送无效字段将导致422 Unprocessable Entity响应 . [...]


    Michael Kropat整理了一个set of diagrams,在选择最合适的状态代码时非常有见地 . 有关 4xx 状态代码,请参见下图:

    Picking the right 4xx status code

相关问题