Основы HTTP
Основы HTTP
HTTP (HyperText Transfer Protocol) - это протокол передачи данных, который лежит в основе всего веба. Каждый раз, когда вы открываете сайт, ваш браузер общается с сервером именно по HTTP. Подробнее про устройство веба - в уроке как работает веб.
Что такое HTTP?
HTTP - это текстовый протокол типа "запрос-ответ":
- Клиент (браузер, мобильное приложение, curl) отправляет запрос
- Сервер обрабатывает его и возвращает ответ
Простой пример HTTP-запроса:
GET /api/users HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: application/json
И ответ сервера:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 52
{"id": 1, "name": "Alice", "email": "alice@example.com"}
Методы HTTP
Основные методы (глаголы) HTTP:
GET - получение данных
curl -X GET https://api.example.com/users/123
- Не должен изменять данные на сервере
- Параметры передаются в URL
- Можно кешировать
- Безопасный и идемпотентный
POST - создание ресурса
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name": "Bob", "email": "bob@example.com"}'
- Создаёт новый ресурс
- Данные передаются в теле запроса
- Не идемпотентный (каждый вызов создаёт новый ресурс)
PUT - полное обновление
curl -X PUT https://api.example.com/users/123 \
-H "Content-Type: application/json" \
-d '{"name": "Bob Updated", "email": "bob@example.com"}'
- Заменяет весь ресурс целиком
- Идемпотентный (повторные вызовы дают тот же результат)
PATCH - частичное обновление
curl -X PATCH https://api.example.com/users/123 \
-H "Content-Type: application/json" \
-d '{"name": "Bob Smith"}'
- Обновляет только указанные поля
- Более эффективен для больших объектов
DELETE - удаление
curl -X DELETE https://api.example.com/users/123
- Удаляет ресурс
- Идемпотентный
Коды ответов
HTTP использует числовые коды для обозначения результата обработки запроса:
2xx - Успех
- 200 OK - всё хорошо
- 201 Created - ресурс создан (обычно после POST)
- 204 No Content - успех, но нет данных для возврата
3xx - Перенаправление
- 301 Moved Permanently - ресурс переехал навсегда
- 302 Found - временное перенаправление
- 304 Not Modified - ресурс не изменился (для кеширования)
4xx - Ошибка клиента
- 400 Bad Request - неверный формат запроса
- 401 Unauthorized - требуется аутентификация
- 403 Forbidden - доступ запрещён
- 404 Not Found - ресурс не найден
- 422 Unprocessable Entity - неверные данные
5xx - Ошибка сервера
- 500 Internal Server Error - общая ошибка сервера
- 502 Bad Gateway - ошибка прокси-сервера
- 503 Service Unavailable - сервис временно недоступен
Заголовки HTTP
Заголовки передают дополнительную информацию о запросе или ответе.
Важные заголовки запроса:
Host: api.example.com
User-Agent: MyApp/1.0
Accept: application/json
Content-Type: application/json
Authorization: Bearer token123
Важные заголовки ответа:
Content-Type: application/json
Content-Length: 1234
Cache-Control: max-age=3600
Set-Cookie: session=abc123
Практический пример
Давайте посмотрим на реальное взаимодействие с API:
# 1. Получаем список пользователей
curl -i https://jsonplaceholder.typicode.com/users
# 2. Получаем конкретного пользователя
curl -i https://jsonplaceholder.typicode.com/users/1
# 3. Создаём нового пользователя
curl -i -X POST https://jsonplaceholder.typicode.com/users \
-H "Content-Type: application/json" \
-d '{
"name": "Test User",
"email": "test@example.com"
}'
# 4. Обновляем пользователя
curl -i -X PUT https://jsonplaceholder.typicode.com/users/1 \
-H "Content-Type: application/json" \
-d '{
"name": "Updated User",
"email": "updated@example.com"
}'
HTTP/2 и HTTP/3
Современные версии HTTP добавляют новые возможности:
HTTP/2:
- Мультиплексирование (несколько запросов в одном соединении)
- Сжатие заголовков
- Server Push
HTTP/3:
- Работает поверх QUIC (не TCP)
- Ещё быстрее
- Лучше работает при потере пакетов
Инструменты для работы с HTTP
- curl - универсальная утилита командной строки
- Postman - GUI для тестирования API
- httpie - curl с человеческим лицом
- Browser DevTools - Network вкладка
Итоги
HTTP - это основа веб-коммуникаций. Понимание его принципов критически важно для:
- Разработки API
- Отладки сетевых проблем
- Оптимизации производительности
- Обеспечения безопасности
В следующем уроке мы подробнее рассмотрим работу с JSON - самым популярным форматом данных в HTTP API. Реализация HTTP-сервера на Go - в уроке net/http.