← Назад к вопросам
В чем разница между запросом и ответом сервера?
1.3 Junior🔥 241 комментариев
#API и сетевые протоколы
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между HTTP запросом и ответом сервера
Это фундаментальная концепция веб-разработки. Клиент отправляет запрос, сервер отправляет ответ.
HTTP Запрос (Request)
Клиент (браузер, мобильное приложение, другой сервер) отправляет запрос к серверу.
Структура запроса:
[METHOD] [URL] [HTTP VERSION]
[HEADERS]
[BODY]
Пример:
GET /api/v1/users/123 HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJhbGc...
Content-Type: application/json
User-Agent: Mozilla/5.0
Accept: application/json
Основные части:
-
METHOD (HTTP глагол)
GET— получить ресурсPOST— создать новый ресурсPUT— полное обновление ресурсаPATCH— частичное обновлениеDELETE— удалить ресурсHEAD— как GET но без body
-
URL (Uniform Resource Locator)
https://api.example.com/api/v1/users/123?sort=name&limit=10 │ │ │ │ Protocol Domain Path Query params -
Headers (Заголовки)
Host— адрес сервераContent-Type— тип данных в body (application/json, text/html)Authorization— токен доступаAccept— какой тип ответа клиент хочетUser-Agent— что отправляет запрос- Custom headers — свои заголовки
-
Body (Тело запроса)
- Есть только в POST, PUT, PATCH
- Отсутствует в GET, DELETE, HEAD
- JSON, XML, form data и т.д.
Пример запроса с body:
POST /api/v1/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 45
{
"name": "Alice",
"email": "alice@example.com",
"age": 30
}
HTTP Ответ (Response)
Сервер отправляет ответ на запрос клиента.
Структура ответа:
HTTP/1.1 [STATUS CODE] [STATUS TEXT]
[HEADERS]
[BODY]
Пример:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 52
Set-Cookie: sessionId=abc123; Path=/; HttpOnly
X-Rate-Limit: 1000
{
"id": 123,
"name": "Alice",
"email": "alice@example.com"
}
Основные части:
-
Status Code (Код статуса)
200 OK— успешно201 Created— ресурс создан204 No Content— успешно, но нет данных400 Bad Request— ошибка в запросе401 Unauthorized— не авторизован403 Forbidden— нет доступа404 Not Found— ресурс не найден500 Internal Server Error— ошибка на сервере503 Service Unavailable— сервис недоступен
-
Headers (Заголовки ответа)
Content-Type— тип данных в bodyContent-Length— размер bodySet-Cookie— установить cookiesCache-Control— кэшированиеAccess-Control-*— CORS заголовкиX-Custom-Header— свои заголовки
-
Body (Тело ответа)
- JSON, HTML, XML, images, files
- Может быть пустым (например в DELETE)
На примере Express
import express, { Request, Response } from 'express';
const app = express();
// Получение запроса и отправка ответа
app.post('/api/v1/users', (req: Request, res: Response) => {
// ---- АНАЛИЗ ЗАПРОСА ----
const method = req.method; // "POST"
const url = req.url; // "/api/v1/users"
const headers = req.headers; // { content-type, authorization, ... }
const body = req.body; // { name: "Alice", ... }
const query = req.query; // ?sort=name → { sort: "name" }
const params = req.params; // /:id → { id: "123" }
const ip = req.ip; // IP клиента
const userAgent = req.get('User-Agent'); // браузер/клиент
// Валидация
if (!body.name || !body.email) {
// ---- ОТПРАВКА ОШИБКИ ----
return res.status(400).json({
error: 'Name and email are required'
});
}
// Обработка
const user = {
id: 123,
name: body.name,
email: body.email,
createdAt: new Date()
};
// ---- ОТПРАВКА УСПЕШНОГО ОТВЕТА ----
res.status(201) // Status code
.set('Content-Type', 'application/json') // Header
.set('X-Custom-Header', 'value') // Custom header
.json(user); // Body
// Эквивалент:
// res.status(201).json(user);
});
app.listen(3000);
Полный цикл Request-Response
// КЛИЕНТ (браузер)
const response = await fetch('/api/v1/users/123', {
method: 'GET',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer token123'
}
});
// ↓ HTTP запрос отправляется на сервер ↓
// СЕРВЕР (Express)
app.get('/api/v1/users/:id', (req, res) => {
const userId = req.params.id; // "123" из URL
// Поиск пользователя
const user = database.findUser(userId);
if (!user) {
res.status(404).json({ error: 'User not found' });
return;
}
res.status(200).json(user);
});
// ↓ HTTP ответ отправляется клиенту ↓
// КЛИЕНТ получает ответ
const data = await response.json();
console.log(data); // { id: 123, name: "Alice", ... }
Различия в таблице
| Аспект | Запрос | Ответ |
|---|---|---|
| Отправляет | Клиент | Сервер |
| URL | Есть | Нет |
| METHOD | Есть (GET/POST/...) | Нет |
| Status code | Нет | Есть (200/404/...) |
| Body | Опционально | Опционально |
| Headers | Есть | Есть |
| Пример | GET /api/users | 200 OK + JSON |
REST API примеры
1. Получение списка пользователей
-- ЗАПРОС
GET /api/v1/users?limit=10 HTTP/1.1
Host: api.example.com
-- ОТВЕТ
HTTP/1.1 200 OK
Content-Type: application/json
[
{ "id": 1, "name": "Alice" },
{ "id": 2, "name": "Bob" }
]
2. Создание пользователя
-- ЗАПРОС
POST /api/v1/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
{ "name": "Alice", "email": "alice@example.com" }
-- ОТВЕТ
HTTP/1.1 201 Created
Content-Type: application/json
Location: /api/v1/users/123
{ "id": 123, "name": "Alice", "email": "alice@example.com" }
3. Ошибка валидации
-- ЗАПРОС
POST /api/v1/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
{ "name": "" }
-- ОТВЕТ
HTTP/1.1 400 Bad Request
Content-Type: application/json
{ "error": "Name is required", "code": "VALIDATION_ERROR" }
Основные моменты
- Запрос инициирует клиент, ответ отправляет сервер
- METHOD определяет операцию — GET читает, POST создает
- Status code указывает результат — 200 успех, 400+ ошибка
- Headers содержат метаданные — тип, размер, кэширование
- Body может быть в обоих — данные запроса и ответа
- One request = One response — всегда парная связь