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

Как происходит передача данных в GET?

1.6 Junior🔥 141 комментариев
#Интеграции и API

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

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

Как происходит передача данных в 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 есть три части:

  1. Базовый URL (base URL): /api/products — это путь к ресурсу

  2. Query string (параметры): ?price=100&category=electronics&limit=10 — параметры

  3. 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

АспектGETPOST
Где данныеURLBody
ОбъёмОграничен (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&param2=value2
  • Ограничена длина (~2000 символов)
  • Видно в адресной строке (не секретно)
  • Кэшируется браузером

Используй GET для:

  • Получение данных
  • Фильтрация (query string)
  • Сортировка (query string)
  • Пагинация (query string)

Не используй GET для:

  • Создание/обновление данных (POST/PUT)
  • Чувствительные данные (password, credit card)
  • Большие объёмы данных (используй POST)