Ответ
При тестировании 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=secret123multipart/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.