Что означает HTTP статус-код 412?

Ответ

HTTP 412 Precondition Failed означает, что сервер не выполнил одно или несколько условий, указанных клиентом в условных заголовках запроса.

Применение: Используется для оптимистичной блокировки и предотвращения конфликтов при обновлении ресурсов (например, по механизму ETag).

Пример:

  1. Клиент получает ресурс, и в ответе приходит заголовок ETag: "abc123".
  2. Для его обновления клиент отправляет запрос:

    PUT /api/resource/1 HTTP/1.1
    If-Match: "abc123"
    Content-Type: application/json
    
    {"data": "new value"}
  3. Если за это время другой клиент уже изменил ресурс и его ETag стал "def456", сервер вернет:
    HTTP/1.1 412 Precondition Failed

Распространенные условные заголовки: If-Match, If-None-Match, If-Modified-Since, If-Unmodified-Since.

Ответ 18+ 🔞

А, слушай, вот эта штука — 412-й статус! Это ж классика, когда ты пытаешься быть умным, а сервер тебе такой: «Нет, мудила, не срослось».

По-русски: Сервер посмотрел на твои условия в заголовках и сказал: «Хуй тебе, а не выполнение». Типа, ты поставил какие-то рамки, а они не сошлись.

Где это вылазит, как говно из проруби? Ну, например, когда ты пытаешься по-хитрому избежать конфликтов. Смотри, как это обычно бывает:

  1. Ты запрашиваешь какой-нибудь файл или запись. Сервер, такой довольный, отдаёт её и прицепляет ETag — этакую цифровую печать, хуле. Допустим, "abc123".
  2. Ты думаешь: «Ща я эту хуйню обновлю!». И шлёшь запрос на изменение, но с условием: «Измени только если печать всё ещё "abc123", я ж не мудак, чтобы поверх чужого писать».

    PUT /api/resource/1 HTTP/1.1
    If-Match: "abc123"
    Content-Type: application/json
    
    {"data": "new value"}
  3. А за то время, пока ты чесал жопу, какой-то другой хитрожопый клиент уже успел всё изменить. Теперь у ресурса печать "def456".
  4. Сервер смотрит на твой заголовок If-Match: "abc123", смотрит на актуальную печать "def456", и его ответ — просто шедевр лаконичности:
    HTTP/1.1 412 Precondition Failed

    Перевод: «Условие не выполнилось, иди на хуй. Ресурс-то уже другой, ебать!»

Какие ещё бывают предлоги для такого пиздеца? Да почти любые условные заголовки: If-Match, If-None-Match, If-Modified-Since, If-Unmodified-Since. Короче, любая твоя попытка поставить серверу рамки может обернуться этим самым «Precondition Failed». Ёпта, жизнь-то сложная.