Как передаются параметры в HTTP-запросах

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

Ответ

При тестировании API я работаю с тремя основными способами передачи параметров в HTTP-запросах. Понимание их различий критически важно для корректного составления запросов и валидации ответов.

1. Query Parameters (Параметры строки запроса) Добавляются в сам URL после знака ? в формате ключ=значение. Несколько параметров разделяются амперсандом &.

  • Назначение: Используются в GET-запросах для фильтрации, сортировки, пагинации (например, ?page=2&limit=50).
  • Пример для тестирования:
    # Тестируем поиск товаров с фильтрацией
    GET /api/v1/products?category=electronics&minPrice=500&inStock=true

2. Request Body (Тело запроса) Используется для передачи объемных данных, обычно в запросах POST, PUT, PATCH. Формат тела указывается в заголовке Content-Type.

  • application/json: Самый распространенный формат в REST API.
    POST /api/v1/users
    Content-Type: application/json
    {
      "name": "John Doe",
      "email": "john@example.com",
      "active": true
    }
  • application/x-www-form-urlencoded: Пары ключ-значение, аналогично query string, но в теле запроса.
    POST /api/v1/login
    Content-Type: application/x-www-form-urlencoded
    username=john&password=secret123
  • multipart/form-data: Для отправки файлов вместе с данными формы.

3. Path Parameters (Параметры пути) Встраиваются непосредственно в путь URL, часто для идентификации ресурса.

  • Пример:
    # Получить пользователя с ID 42
    GET /api/v1/users/42
    # Получить заказ №123 пользователя 42
    GET /api/v1/users/42/orders/123

4. Headers (Заголовки) Передают метаинформацию: авторизацию, тип контента, информацию о клиенте.

  • Примеры важных для тестирования заголовков:
    Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
    Content-Type: application/json
    Accept: application/json
    User-Agent: MyQA-Automation-Suite/1.0

Практический пример в автотестах (Python, requests):

import requests
import pytest

BASE_URL = "https://api.example.com"

def test_get_with_query_params():
    """Тест GET-запроса с параметрами фильтрации."""
    params = {"status": "completed", "limit": 10}
    response = requests.get(f"{BASE_URL}/orders", params=params)

    assert response.status_code == 200
    orders = response.json()
    assert len(orders) <= 10
    # Проверяем, что все возвращенные заказы имеют статус 'completed'
    assert all(order["status"] == "completed" for order in orders)

def test_post_with_json_body():
    """Тест создания ресурса через POST с JSON телом."""
    payload = {
        "title": "Test Product",
        "price": 99.99,
        "sku": "TEST-001"
    }
    headers = {"Authorization": "Bearer test-token-123"}

    response = requests.post(
        f"{BASE_URL}/products",
        json=payload,  # Библиотека requests сама установит Content-Type: application/json
        headers=headers
    )

    assert response.status_code == 201
    created_product = response.json()
    assert created_product["id"] is not None
    assert created_product["title"] == payload["title"]

При тестировании API я всегда проверяю, что параметры передаются именно тем методом и в том формате, который ожидает бэкенд, так как это частая причина ошибок 400 Bad Request или 422 Unprocessable Entity.