Как происходит передача данных в GET?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как происходит передача данных в GET запросе
GET — это один из основных HTTP методов. Важно понимать как он работает для анализа API требований.
Определение
GET запрос — это HTTP запрос для получения данных с сервера. "Get" = получить.
По спецификации HTTP, GET должен быть:
- Безопасным (не меняет состояние)
- Идемпотентным (несколько одинаковых запросов = один результат)
- Кэшируемым
Как GET передаёт данные
GET передаёт параметры в URL (query string), НЕ в body:
Пример:
GET /api/products?price=100&category=electronics&limit=10
Структура:
GET <URL>?<параметр1>=<значение1>&<параметр2>=<значение2>
В URL есть три части:
-
Базовый URL (base URL):
/api/products— это путь к ресурсу -
Query string (параметры):
?price=100&category=electronics&limit=10— параметры -
Fragment (якорь, опционально):
#reviews— якорь в странице (не отправляется на сервер)
Пример GET запроса
Клиент отправляет:
GET /api/users/123?format=json&include=profile HTTP/1.1
Host: api.example.com
Accept: application/json
Сервер получает:
Логика:
- Пользователь: 123
- Формат: JSON
- Включить: profile
Ответ: JSON данные пользователя 123 с профилем
Как браузер отправляет GET
Простой способ (в адресной строке):
https://example.com/search?q=javascript&sort=popularity
Браузер отправляет GET запрос с параметрами q=javascript и sort=popularity
Через JavaScript (Fetch API):
fetch('/api/products?price=100&category=electronics')
.then(response => response.json())
.then(data => console.log(data))
Что НЕ входит в GET (в отличие от POST)
GET НЕ отправляет:
- Body (тело запроса пусто)
- Файлы
- Большие объёмы данных
Почему?
Specs: GET должен быть безопасным
(может быть прозрачен, безопасен)
Лимиты: URL имеет макс длину (~2000 символов)
Нельзя отправить 1MB данных в URL
Сравнение GET vs POST
| Аспект | GET | POST |
|---|---|---|
| Где данные | URL | Body |
| Объём | Ограничен (2000 символов) | Больший объём |
| Видимость | Видно в URL (не секретно) | Скрыто в body |
| Кэширование | Да | Обычно нет |
| Безопасность | Не для passwords | Для passwords |
| Использование | Получить данные | Создать / изменить |
Примеры GET в реальной жизни
Пример 1: Поиск товаров
GET /api/products?search=laptop&price_min=500&price_max=2000&sort=price
Параметры:
- search: laptop
- price_min: 500
- price_max: 2000
- sort: price
Сервер возвращает: Массив ноутбуков в диапазоне цены
Пример 2: Пагинация
GET /api/users?page=2&limit=10&sort=name
Параметры:
- page: 2 (вторая страница)
- limit: 10 (10 элементов на странице)
- sort: name (сортировать по имени)
Сервер возвращает: Пользователи 11-20 отсортированные по имени
Пример 3: Фильтрация
GET /api/orders?status=pending&customer=john&date_from=2025-01-01
Параметры:
- status: pending (статус заказа)
- customer: john (имя клиента)
- date_from: 2025-01-01 (дата начала)
Сервер возвращает: Все ожидающие заказы от John с января
Кодирование специальных символов
Проблема: URL не может содержать пробелы и спецсимволы
Решение: URL Encoding (URL encode special characters)
Примеры:
Пробел → %20 (или +)
# → %23
& → %26
= → %3D
Пример:
Поиск: "iPhone 15"
ENCODED: "iPhone%2015" или "iPhone+15"
Полный URL: /api/search?q=iPhone%2015
GET с ID в URL vs Query String
Два подхода:
Подход 1: ID в path (RESTful style)
GET /api/users/123 (получить пользователя 123)
GET /api/users/123/orders (получить заказы пользователя 123)
Подход 2: Query string (параметры)
GET /api/users?id=123 (то же самое)
GET /api/orders?user_id=123
Лучше первый подход (path) — это RESTful convention.
Query string для фильтров и опций:
GET /api/products?category=electronics&sort=price&limit=10
Безопасность GET
GET видно в URL (не секретно):
❌ Плохо: GET /api/login?username=john&password=secret
✅ Хорошо: POST /api/login с username и password в body
GET кэшируется браузером:
Первый запрос: GET /api/data
Браузер кэширует ответ
Второй запрос: Возвращает из кэша (может быть старые данные)
Используй cache headers правильно!
GET может быть перехвачен в логах:
❌ GET /api/users?credit_card=4532111111111111
Это видно в logs, очень небезопасно!
✅ POST с данными в encrypted body
Как BA пишет требования для GET
Правильное требование:
As a user
I want to search products by category and price
So that I find products within my budget
AC:
- GET /api/products?category=<category>&price_min=<price>&price_max=<price>
- Returns: Array of products matching filters
- Performance: < 200ms
- Pagination: default limit=20, max=100
- Sorting: by price, popularity, date
Example:
GET /api/products?category=electronics&price_min=100&price_max=500
Response: [
{id: 1, name: "Laptop", price: 450},
{id: 2, name: "Mouse", price: 25}
]
Типичные ошибки BA
Ошибка 1: Забыли про URL limits
❌ "Отправь все фильтры в GET"
Если фильтров много (> 2000 символов), нужен POST
Ошибка 2: Конфузия GET vs POST
❌ "GET для создания новой записи" (это POST!)
✅ "GET для получения данных"
Ошибка 3: Чувствительные данные в GET
❌ GET /api/charge?card=1234-5678&amount=100
✅ POST /api/payments с данными в body
Ошибка 4: Забыли про кодирование
❌ "Отправь пробел как есть" (URL не поддерживает)
✅ Используй URL encoding (%20 для пробела)
Вывод
GET передаёт данные в URL (query string), не в body:
- Параметры: ?param1=value1¶m2=value2
- Ограничена длина (~2000 символов)
- Видно в адресной строке (не секретно)
- Кэшируется браузером
Используй GET для:
- Получение данных
- Фильтрация (query string)
- Сортировка (query string)
- Пагинация (query string)
Не используй GET для:
- Создание/обновление данных (POST/PUT)
- Чувствительные данные (password, credit card)
- Большие объёмы данных (используй POST)