迭代到同一请求时使用哪种状态?

时间:2018-08-11 14:20:00

标签: rest api-design http-status-codes

我担心在以下情况下需要使用哪个状态代码:

假设我具有以下端点:

https://my-restaurant.api.com/v1/orders

然后我发出了POST请求,请求中包含一些体内元素以开始新的订单:

{
  date: "2018-08-10T09:00:00.000-03:00",
  order: 12345
}

响应如下:

{
  require_additional_data: true,
  customers: [],
  waiter: "Jon Doe"
}

在这里,该服务告知在关闭订单之前需要更多数据。下一步将以相同的正文重复该请求,但要提供有关订单的更多数据。

在这种情况下,响应状态代码应为200 OK?我猜一旦服务告诉订单已完成并获得所有必需的信息,那将是200 OK

在此之前,将使用哪个状态代码?

2 个答案:

答案 0 :(得分:0)

在这种情况下,请勿使用200。请记住,2xx状态码表示服务器已成功接收,理解并接受了请求。那不是你的情况。

4xx状态代码将更适合您的问题中描述的情况。您可以按照评论中的说明使用422。它表明由于语义错误而无法处理请求实体(但是从语法上来说是正确的)。请参见下面的定义:

  

11.2. 422 Unprocessable Entity

     

422(不可处理实体)状态代码表示服务器      了解请求实体的内容类型(因此      415(不受支持的媒体类型)状态码不正确),并且      请求实体的语法正确(因此400(错误请求)      状态代码不正确),但无法处理其中的内容      说明。例如对于如果XML可能会出现此错误情况      请求正文包含格式正确(即语法正确)的内容,但      语义错误的XML指令。

答案 1 :(得分:0)

这取决于状态周期或订单资源的限制:

  • 订单资源(在您的数据库或任何持久层中)可以为空吗?
    • 如果是,则应返回200。
    • 如果否,则应返回400 Bad请求。您还可以返回更精确的422。

两个都是好的答案。 如果创建订单对您来说是一个漫长的过程,需要多个请求,那么该订单可能为空。

例如:

  1. 创建空订单
  2. 添加第一餐
  3. 添加第二餐
  4. 加酒

如果创建订单是一个基本请求,或者您不想在基础中看到任何空订单,则该订单不能为空。