Что передаётся в HTTP-заголовке Accept?

«Что передаётся в HTTP-заголовке Accept?» — вопрос из категории HTTP и веб-протоколы, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Заголовок Accept (иногда ошибочно называемый Accept-Type) — это HTTP-заголовок запроса, в котором клиент сообщает серверу, какие типы медиаданных (MIME-типы) он может обработать и предпочитает получить в ответе. Сервер использует эту информацию для согласования содержимого (Content Negotiation).

Синтаксис и параметр качества (q):

Accept: <тип>/<подтип>; q=<вес>, <тип>/<подтип>
  • q (quality factor) — значение от 0 до 1, определяющее предпочтение. По умолчанию q=1.
  • Сервер выбирает тип с наивысшим весом, который он может предоставить.

Практические примеры для тестирования:

1. Проверка, что API корректно возвращает JSON при соответствующем заголовке:

import requests

def test_api_returns_json_when_accept_header_is_set():
    headers = {'Accept': 'application/json'}
    response = requests.get('https://api.example.com/data', headers=headers)

    assert response.status_code == 200
    # Критически важная проверка
    assert response.headers['Content-Type'] == 'application/json'
    # Убеждаемся, что тело можно распарсить как JSON
    data = response.json()
    assert data is not None

2. Тестирование согласования содержимого (сервер выбирает предпочтительный тип):

def test_content_negotiation():
    # Клиент предпочитает JSON, но согласен на XML с меньшим приоритетом
    headers = {'Accept': 'application/json; q=1.0, application/xml; q=0.5'}
    response = requests.get('https://api.example.com/config', headers=headers)

    # Ожидаем, что сервер, поддерживающий оба формата, вернет JSON
    assert 'application/json' in response.headers['Content-Type']

3. Негативный тест: запрос неподдерживаемого формата (должен вернуть 406):

def test_406_not_acceptable():
    # Запрашиваем формат, который сервер не поддерживает
    headers = {'Accept': 'text/plain'}
    response = requests.get('https://api.example.com/users', headers=headers)

    # Ожидаем код 406 Not Acceptable
    assert response.status_code == 406

Зачем это QA-инженеру: Понимание и тестирование заголовка Accept критично для:

  • Валидации RESTful API, где формат ответа определяется клиентом.
  • Тестирования совместимости разных клиентов (веб-приложение, мобильное приложение) с одним API.
  • Проверки обработки ошибок (код 406) при запросе неподдерживаемого формата.