REST 创建作中的位置响应标头

对于 REST 终结点, Location 响应标头告知客户端在何处检索新创建的资源。 数据 API 生成器 (DAB) 返回 Location 插入 POST 。 对于 PUT 创建新行的 PATCH 更新插入,可以省略标头。

当 DAB 设置 Location 标头时

Scenario 状态代码 位置标头(当前行为)
POST 创建新行(表) 201 已创建 演示:主键路径段,例如 id/123categoryid/3/pieceid/1
POST 执行返回新行的存储过程 201 已创建 如果可以派生 PK,则存在;如果不能,则为空。
PUT upsert 更新现有行 200 正常 不存在
PUT upsert 插入新行(无 If-Match) 201 已创建 可以省略;不依赖 Location
PATCH upsert 更新现有行 200 正常 不存在
PATCH upsert 插入新行(无 If-Match) 201 已创建 可以省略;不依赖 Location
PUT / PATCH缺少行If-Match: * 404 未找到 不存在
任何更新(已存在行) 200 正常 不存在

行为

  • 复合主键显示为有序段,例如 book_id/1/id/5001categoryid/3/pieceid/1
  • 列名称映射(别名)使用路径中 REST 公开的字段名称。

示例:POST 创建新项

请求

POST /api/Books
Content-Type: application/json

{
  "title": "New Book",
  "publisher_id": 42
}

响应

HTTP/1.1 201 Created
Location: http://localhost:50246/api/Books/id/123
Content-Type: application/json

{
  "id": 123,
  "title": "New Book",
  "publisher_id": 42
}

客户端现在可以 GET http://localhost:50246/api/Books/id/123

示例:POST 插入复合键表

请求

POST /api/Inventory
Content-Type: application/json

{
  "categoryid": 3,
  "pieceid": 1,
  "categoryName": "SciFi"
}

响应

HTTP/1.1 201 Created
Location: http://localhost:50246/api/Inventory/categoryid/3/pieceid/1
Content-Type: application/json

{
  "categoryid": 3,
  "pieceid": 1,
  "categoryName": "SciFi"
}

示例:PUT 更新现有行(无位置)

请求

PUT http://localhost:50246/api/Books/id/1
Content-Type: application/json

{
  "title": "Updated Title"
}

响应

HTTP/1.1 200 OK
Content-Type: application/json

{
  "id": 1,
  "title": "Updated Title"
}

(无 Location 标头)。

示例:PUT 插入新行

请求

PUT http://localhost:50246/api/Books/id/500
Content-Type: application/json

{
  "title": "Inserted via PUT",
  "publisher_id": 7
}

响应

HTTP/1.1 201 Created
Content-Type: application/json

{
  "id": 500,
  "title": "Inserted via PUT",
  "publisher_id": 7
}

Location 此处可能省略标头。

示例:PUT,其中缺少 If-Match 和行

请求

PUT http://localhost:50246/api/Books/id/500
If-Match: *
Content-Type: application/json

{
  "title": "Attempted Update"
}

响应

HTTP/1.1 404 Not Found
Content-Type: application/json

{
  "error": "No Update could be performed, record not found"
}

(无 Location 标头)。

Review

  • 创建 POSTLocation 主键路径存在。
  • 带有更新的 PUT 或 PATCH:否 Location
  • PUT 或 PATCH(插入):返回 201 Created; Location 可以省略(不依赖于它)。
  • 包含 If-Match: *时,DAB 仅在行已存在时执行更新。 如果行缺失,则请求失败且 404 Not Found 不执行插入,因此不会 Location 返回标头。