← Назад к вопросам

Что такое OPTIONS запрос?

2.0 Middle🔥 201 комментариев
#Soft skills и карьера

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое OPTIONS запрос в HTTP

OPTIONS — это метод HTTP запроса, который позволяет клиенту (например, веб-браузеру или другому приложению) узнать, какие методы и возможности поддерживает целевой ресурс (сервер или конкретный URL) без выполнения самого действия. Это своего рода "опрос" или "инспекция" доступных операций.

Основные цели OPTIONS запроса:

  • Определение разрешенных HTTP методов для конкретного ресурса (GET, POST, PUT, DELETE, PATCH и др.).
  • Получение информации о поддерживаемых функциях сервера или приложения.
  • Использование в механизме CORS (Cross-Origin Resource Sharing) для предварительной проверки безопасности при кросс-доменных запросах.

Пример типичного OPTIONS запроса и ответа

Запрос клиента:

OPTIONS /api/users HTTP/1.1
Host: example.com
Origin: https://myapp.com
Access-Control-Request-Method: POST

Ответ сервера:

HTTP/1.1 200 OK
Allow: GET, POST, PUT, DELETE
Access-Control-Allow-Origin: https://myapp.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Content-Length: 0

В этом примере сервер сообщает:

  • Allow: ресурс /api/users поддерживает методы GET, POST, PUT, DELETE.
  • Для CORS: разрешен источник myapp.com, методы GET, POST, PUT, DELETE и заголовки Content-Type, Authorization.

Практическое применение OPTIONS

1. CORS (Cross-Origin Resource Sharing)

Это наиболее распространенное использование в современных веб-приложениях. Когда клиент из одного домена (origin) пытается сделать запрос к ресурсу в другом домене, браузер автоматически отправляет OPTIONS запрос (так называемый "preflight request") перед основным запросом (например, POST или PUT), если он считается "небезопасным" (использует нестандартные заголовки, методы кроме GET, POST, HEAD).

Пример CORS preflight:

// Клиент (браузер) пытается сделать POST запрос с заголовком Authorization
fetch('https://api.example.com/data', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer token123',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ name: 'John' })
});

Браузер автоматически отправляет OPTIONS запрос перед этим POST. Сервер должен ответить соответствующими заголовками CORS, чтобы браузер разрешил основной запрос.

2. Инспекция API (особенно в RESTful API)

Разработчики или инструменты могут использовать OPTIONS для получения метаданных API.

# Пример с curl
curl -X OPTIONS https://api.example.com/users

Ответ может включать не только Allow, но и дополнительную информацию в теле ответа или других заголовках.

3. Тестирование и документация

Для QA Engineer и тестировщиков OPTIONS запросы полезны для:

  • Проверки корректной реализации CORS на сервере.
  • Убеждения, что API возвращает правильный список разрешенных методов.
  • Тестирования безопасности: OPTIONS может раскрывать потенциально опасные методы (например, DELETE), если они не должны быть общедоступными.

Отличия OPTIONS от других HTTP методов

МетодОсновная цельПример
GETПолучение данныхGET /api/users – получить список пользователей
POSTСоздание нового ресурсаPOST /api/users – создать пользователя
PUTПолное обновление ресурсаPUT /api/users/1 – обновить пользователя 1
DELETEУдаление ресурсаDELETE /api/users/1 – удалить пользователя 1
OPTIONSПолучение информации о возможностях ресурсаOPTIONS /api/users – узнать, что можно делать с /api/users

OPTIONS не изменяет состояние ресурса (idempotent и safe), т.е. он не создает, не изменяет и не удаляет данные.


Реализация OPTIONS в коде (пример для Node.js/Express)

const express = require('express');
const app = express();

// Обработка OPTIONS для конкретного маршрута
app.options('/api/users', (req, res) => {
  // Установка заголовков CORS
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  
  // Можно также вернуть заголовок Allow
  res.setHeader('Allow', 'GET, POST, PUT, DELETE, OPTIONS');
  
  // OPTIONS запросы обычно не имеют тела ответа
  res.status(200).end();
});

// Основные методы для этого маршрута
app.get('/api/users', (req, res) => { /* ... */ });
app.post('/api/users', (req, res) => { /* ... */ });
// ... другие методы

Особенности тестирования OPTIONS запросов для QA

При тестировании веб-приложений и API, QA Engineer должен проверять:

  1. Корректность заголовков CORS:

    • OPTIONS запросы должны возвращать правильные Access-Control-Allow-* заголовки.
    • Проверка разных источников (Origin).
  2. Безопасность:

    • OPTIONS не должен раскрывать методы, доступные только для внутреннего использования.
    • На критических ресурсах (например, административных) OPTIONS может быть ограничен.
  3. Совместимость:

    • Проверка, что OPTIONS работает корректно со всеми клиентами (браузеры, мобильные приложения, CLI инструменты).

Пример теста с использованием Python и requests:

import requests

# Тестирование OPTIONS запроса
response = requests.options('https://api.example.com/users')

print("Status Code:", response.status_code)
print("Allow Header:", response.headers.get('Allow'))
print("CORS Headers:")
print("  Access-Control-Allow-Origin:", response.headers.get('Access-Control-Allow-Origin'))
print("  Access-Control-Allow-Methods:", response.headers.get('Access-Control-Allow-Methods'))

# Проверка ожидаемых значений
assert response.status_code == 200
assert 'GET' in response.headers.get('Allow', '')
assert 'POST' in response.headers.get('Allow', '')

Резюме

OPTIONS запрос — важный диагностический и подготовительный метод HTTP, особенно критичный для современных кросс-доменных веб-приложений из-за CORS. Он позволяет клиентам безопасно определять возможности сервера перед выполнением потенциально изменяющих состояние операций. Для QA Engineer понимание и тестирование OPTIONS запросов является частью обеспечения безопасности, совместимости и корректной работы API.