Поделиться через


Заголовок ответа расположения в операции создания REST

Для конечных точек REST заголовок ответа сообщает клиентам, Location где получить только что созданный ресурс. Построитель данных (DAB) возвращает значения Location для POST вставок. Для PUT или PATCH upserts, создающих новые строки, заголовок может быть опущен.

Если DAB задает заголовок Location

Scenario Код состояния Заголовок расположения (текущее поведение)
POST создает новую строку (таблицу) 201 Создано Присутствует: сегменты первичного ключа, например id/123 или categoryid/3/pieceid/1.
POST выполняет хранимую процедуру, возвращающую новые строки 201 Создано Присутствует, если PK может быть производным; может быть пустым, если он не может.
PUT upsert обновляет существующую строку 200 OK (Запрос выполнен успешно) Нет
PUT upsert вставляет новую строку (без If-Match) 201 Создано Может быть опущен; не полагаться на Location
PATCH upsert обновляет существующую строку 200 OK (Запрос выполнен успешно) Нет
PATCH upsert вставляет новую строку (без If-Match) 201 Создано Может быть опущен; не полагаться на Location
PUT / PATCH с отсутствующими строками If-Match: * и 404 Не найдено Нет
Любое обновление (существует строка) 200 OK (Запрос выполнен успешно) Нет

Поведение

  • Составные первичные ключи отображаются как упорядоченные сегменты, например book_id/1/id/5001 или categoryid/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 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 заголовка.)

Отзыв

  • POST с созданием: Location присутствует в пути первичного ключа.
  • PUT или PATCH с обновлением: Нет Location.
  • PUT или PATCH с вставкой: Возвращается 201 Created; Location может быть опущен (не зависит от него).
  • При включении If-Match: *DAB выполняет обновление только в том случае, если строка уже существует. Если строка отсутствует, запрос завершается ошибкой 404 Not Found и не выполняется вставка, поэтому заголовок не Location возвращается.