С вашей ссылки на спецификации:
Если ни один из матча объектные метки, или если «*» дается и не текущий объект не существует, сервер НЕ ДОЛЖЕН выполнять запрошенный метод, и должен возвращать ответ 412 (предварительный отказ). Такое поведение наиболее полезно, когда клиент хочет предотвратить изменение способа обновления, такого как PUT, от изменения ресурса, который был изменен с момента последнего получения клиентом.
Поскольку спецификация требует HTTP 412 (действительно, она использует «ДОЛЖНА»), и, поскольку ясно, что они учитывают именно используемый вариант использования, HTTP 412 кажется правильным кодом ответа.
412 все равно разумно. В запросе указано, что обновление выполняется условно. 412 говорит, что условие не удалось, поэтому служба не будет этого делать. Тем более, что 412 - хорошее соответствие концепции условных запросов; 409, казалось бы, привязаны к определенному виду отказа, который может быть или не быть условным по своему характеру. Например, я мог видеть, что служба возвращает 409 в ответ на безусловный запрос POST-сообщения с внутренним конфликтом.
Но увидеть следующее, а также из спецификации:
10.4.10 409 Конфликт
Запрос не может быть выполнен из-за конфликта с текущим состоянием ресурса. Этот код разрешен только в ситуациях, когда ожидается, что пользователь сможет разрешить конфликт и повторно отправить запрос. Тело ответа ДОЛЖНО включать достаточную информацию, чтобы пользователь мог распознать источник конфликта. В идеальном случае объект ответа будет содержать достаточную информацию для пользователя или агента пользователя для устранения проблемы; однако это может быть невозможно и не требуется.
Конфликты, скорее всего, возникнут в ответ на запрос PUT. Например, если использовалось управление версиями, а объект PUT включал изменения в ресурс, который конфликтует с теми, которые были сделаны с помощью более раннего (стороннего) запроса, сервер может использовать ответ 409, чтобы указать, что он не может выполнить запрос , В этом случае объект ответа, скорее всего, будет содержать список различий между двумя версиями в формате, определяемом ответом Content-Type.
Как бы то ни было, спецификация требует 412 в контексте условного запроса, предполагая, что конфликт версий является ключевым драйвером для 409s.Возможно, 409 будет использоваться там, где конфликт версий происходит как часть безусловного запроса.
Один из ключевых заключается в том, что 409 предполагает «ситуации, когда ожидается, что пользователь сможет разрешить конфликт и повторно отправить запрос». – Papasmile
Я был бы в пользу 409 в любом случае, если бы не спецификация требовала 412 для нарушений предусловий: /. –
Также рассмотрите «Если запрос без поля заголовка If-Match приведет к чему-либо другому, кроме состояния 2xx или 412, тогда заголовок If-Match ДОЛЖЕН быть проигнорирован». – Papasmile