---
title: 'Условные запросы'
sidebar_label: 'Условные запросы'
description: 'Для чего нужны условные запросы, какие заголовки можно использовать'
sidebar_position: 6
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import {CustomTable} from '@selectel/docux/components'

# Условные запросы

Условные запросы (Conditional Requests) в [S3 API](/api/object-storage-s3/) позволяют выполнять операции только при соблюдении определенных условий с помощью [заголовков](#headers).
С их помощью можно:

* выполнять запросы на чтение и запись с предварительной проверкой состояния объекта;
* управлять обновлениями и загрузками объектов, опираясь на их текущее состояние или метаданные;
* соответствовать привычным сценариям работы по стандартам S3;
* защитить данные от случайных перезаписей;
* оптимизировать расходы на трафик.

Условные запросы можно использовать для разных [сценариев](#usage-examples).

## Заголовки \{#headers}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Операция</th>
        <th>Поддерживаемые заголовки</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td>[PutObject](#put-object)</td>

        <td>
          * `If-Match`;
          * `If-None-Match`
        </td>
      </tr>

      <tr>
        <td>[CopyObject](#copy-object-and-upload-part-copy)</td>

        <td>
          * `x-amz-copy-source-if-match`;
          * `x-amz-copy-source-if-none-match`;
          * `x-amz-copy-source-if-modified-since`;
          * `x-amz-copy-source-if-unmodified-since`;
          * `If-Match`;
          * `If-None-Match`
        </td>
      </tr>

      <tr>
        <td>[UploadPartCopy](#copy-object-and-upload-part-copy)</td>

        <td>
          * `x-amz-copy-source-if-match`;
          * `x-amz-copy-source-if-none-match`;
          * `x-amz-copy-source-if-modified-since`;
          * `x-amz-copy-source-if-unmodified-since`;
          * `If-Match`;
          * `If-None-Match`
        </td>
      </tr>

      <tr>
        <td>[DeleteObject](#delete-object)</td>
        <td>`If-Match`</td>
      </tr>

      <tr>
        <td>[CompleteMultipartUpload](#complete-multipart-upload)</td>

        <td>
          * `If-Match`;
          * `If-None-Match`
        </td>
      </tr>
    </tbody>
  </table>
</CustomTable>

### Операции PutObject \{#put-object}

Примеры загрузки объектов с условиями можно посмотреть в подразделе [Загрузить объект](/s3/tools/aws-cli.mdx#upload-object) инструкции [AWS CLI](/s3/tools/aws-cli.mdx).

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Заголовок</th>
        <th>Условное выполнение</th>
        <th>Ошибка при нарушении</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <th>`If-Match`</th>
        <td>Объект записывается, если активная версия существует и ее ETag совпадает со значением, указанным в заголовке</td>
        <td>`412 Precondition Failed`</td>
      </tr>

      <tr>
        <th>`If-None-Match`</th>
        <td>Объект записывается, если у ключа нет активной версии, включая delete marker</td>
        <td>`412 Precondition Failed`</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

### Операции CopyObject и UploadPartCopy \{#copy-object-and-upload-part-copy}

Примеры копирования объектов с условиями можно посмотреть в подразделе [Копировать объект](/s3/tools/aws-cli.mdx#copy-object) инструкции [AWS CLI](/s3/tools/aws-cli.mdx).

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Заголовок</th>
        <th>Условное выполнение</th>
        <th>Ошибка при нарушении</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <th>`x-amz-copy-source-if-match`</th>
        <td>Объект копируется, если ETag исходного объекта совпадает со значением, указанным в заголовке</td>
        <td>`412 Precondition Failed`</td>
      </tr>

      <tr>
        <th>`x-amz-copy-source-if-none-match`</th>
        <td>Объект копируется, если ETag исходного объекта не совпадает со значением, указанным в заголовке</td>
        <td>`412 Precondition Failed`</td>
      </tr>

      <tr>
        <th>`x-amz-copy-source-if-modified-since`</th>
        <td>Объект копируется, если объект изменен позже даты, указанной в заголовке</td>
        <td>`412 Precondition Failed`</td>
      </tr>

      <tr>
        <th>`x-amz-copy-source-if-unmodified-since`</th>
        <td>Объект копируется, если объект не был изменен после даты, указанной в заголовке</td>
        <td>`412 Precondition Failed`</td>
      </tr>

      <tr>
        <th>`If-Match`</th>
        <td>Объект копируется, если активная версия существует и ее ETag совпадает со значением, указанным в заголовке</td>
        <td>`412 Precondition Failed`</td>
      </tr>

      <tr>
        <th>`If-None-Match`</th>
        <td>Объект копируется, если у ключа нет активной версии, включая delete marker</td>
        <td>`412 Precondition Failed`</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

### Операции DeleteObject \{#delete-object}

Примеры удаления объектов с условиями можно посмотреть в подразделе [Удалить объект](/s3/tools/aws-cli.mdx#delete-object) инструкции [AWS CLI](/s3/tools/aws-cli.mdx).

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Заголовок</th>
        <th>Условное выполнение</th>
        <th>Ошибка при нарушении</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <th>`If-Match`</th>
        <td>Объект удаляется, если активная версия существует и ее ETag совпадает со значением, указанным в заголовке</td>
        <td>`412 Precondition Failed`</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

### Операции CompleteMultipartUpload \{#complete-multipart-upload}

<CustomTable>
  <table>
    <thead>
      <tr>
        <th>Заголовок</th>
        <th>Условное выполнение</th>
        <th>Ошибка при нарушении</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <th>`If-Match`</th>
        <td>Завершение [сегментированной загрузки](/s3/objects/upload-object.mdx#segmented-upload) выполняется, если ETag объекта совпадает со значением, указанным в заголовке</td>
        <td>`412 Precondition Failed`</td>
      </tr>

      <tr>
        <th>`If-None-Match`</th>
        <td>Завершение [сегментированной загрузки](/s3/objects/upload-object.mdx#segmented-upload) выполняется, если объект не существует</td>
        <td>`412 Precondition Failed`</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

## Описание ошибок \{#errors}

<CustomTable>
  <table>
    <tbody>
      <tr>
        <th>`404 Not Found`</th>
        <td>Объект не найден (например, при заголовке `If-Match`)</td>
      </tr>

      <tr>
        <th>`409 Conflict`</th>
        <td>Объект был изменен или удален до выполнения условной операции</td>
      </tr>

      <tr>
        <th>`412 Precondition Failed`</th>
        <td>Условие в заголовке не выполнено</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

## Примеры сценариев использования \{#usage-examples}

* защита от конфликтов при обновлении — объект будет обновлен, только если он не изменился с последнего обращения (заголовок `If-Match`);
* синхронизация данных — объект будет загружен, только если он был изменен после указанного времени (заголовок `If-Modified-Since`);
* оптимизация чтения — объект будет получен, только если он не совпадает с локальной версией (заголовок `If-None-Match`);
* защита от перезаписи — объект не будет записан по ключу, если уже есть другой объект с таким ключом (заголовок `If-None-Match`).

<Formbricks />
