← Назад к вопросам
Какой протокол обмена сообщениями используется в REST?
1.0 Junior🔥 201 комментариев
#REST API и микросервисы
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Протокол обмена сообщениями в REST
Основной протокол: HTTP/HTTPS
REST (Representational State Transfer) использует **HTTP (HyperText Transfer Protocol)** как основной протокол обмена сообщениями. В современных приложениях чаще используется **HTTPS** (защищённая версия с SSL/TLS шифрованием).
HTTP и REST
REST — это архитектурный стиль, который построен на базе HTTP и использует его возможности:
HTTP метод ───────> Действие
GET ────> Получение ресурса
POST ────> Создание ресурса
PUT ────> Полное обновление ресурса
PATCH ────> Частичное обновление ресурса
DELETE ────> Удаление ресурса
HEAD ────> Получение заголовков (без тела ответа)
OPTIONS ────> Получение допустимых методов для ресурса
Структура HTTP запроса
┌─────────────────────────────────────┐
│ GET /api/v1/users/123 HTTP/1.1 │ ← Запрос (метод, URL, версия)
├─────────────────────────────────────┤
│ Host: api.example.com │ ← Заголовки
│ Accept: application/json │
│ Authorization: Bearer token123 │
│ Content-Length: 0 │
├─────────────────────────────────────┤
│ │ ← Пустая строка
│ │ ← Тело запроса (обычно пусто для GET)
└─────────────────────────────────────┘
Структура HTTP ответа
┌─────────────────────────────────────┐
│ HTTP/1.1 200 OK │ ← Статус (версия, код, описание)
├─────────────────────────────────────┤
│ Content-Type: application/json │ ← Заголовки
│ Content-Length: 150 │
│ Date: Mon, 22 Mar 2026 10:30:00 GMT│
├─────────────────────────────────────┤
│ │ ← Пустая строка
│ { │ ← Тело ответа (JSON)
│ "id": 123, │
│ "name": "John Doe", │
│ "email": "john@example.com" │
│ } │
└─────────────────────────────────────┘
Коды состояния HTTP
1xx — Информационные ответы
100 Continue — Продолжайте отправку тела запроса
101 Switching Protocols — Переход на другой протокол
2xx — Успешные ответы
200 OK — Запрос успешен
201 Created — Ресурс создан
202 Accepted — Запрос принят на обработку
204 No Content — Успешен, но нет содержимого
3xx — Перенаправления
300 Multiple Choices — Несколько вариантов
301 Moved Permanently — Постоянное перенаправление
304 Not Modified — Кэш актуален
4xx — Ошибки клиента
400 Bad Request — Некорректный запрос
401 Unauthorized — Требуется аутентификация
403 Forbidden — Доступ запрещён
404 Not Found — Ресурс не найден
409 Conflict — Конфликт (например, дублирование)
5xx — Ошибки сервера
500 Internal Server Error — Внутренняя ошибка
501 Not Implemented — Не реализовано
503 Service Unavailable — Сервис недоступен
Пример REST запроса и ответа в Java
Клиент:
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
public class RestClient {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
// GET запрос
HttpRequest getRequest = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/api/v1/users/123"))
.GET()
.header("Accept", "application/json")
.build();
HttpResponse<String> response = client.send(
getRequest,
HttpResponse.BodyHandlers.ofString()
);
System.out.println("Статус: " + response.statusCode());
System.out.println("Тело: " + response.body());
// POST запрос
HttpRequest postRequest = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/api/v1/users"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(
"{\"name\": \"Jane\", \"email\": \"jane@example.com\"}"
))
.build();
HttpResponse<String> postResponse = client.send(
postRequest,
HttpResponse.BodyHandlers.ofString()
);
System.out.println("Статус POST: " + postResponse.statusCode());
System.out.println("Ответ: " + postResponse.body());
}
}
Сервер (Spring Boot):
import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;
@RestController
@RequestMapping("/api/v1")
public class UserController {
// GET запрос
@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = new User(id, "John Doe", "john@example.com");
return ResponseEntity.ok(user);
// HTTP 200 OK с телом ответа
}
// POST запрос
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody UserRequest request) {
User user = new User(null, request.getName(), request.getEmail());
// Сохраняем в БД и получаем ID
user.setId(1L);
return ResponseEntity.status(201).body(user);
// HTTP 201 Created с телом ответа
}
// PUT запрос
@PutMapping("/users/{id}")
public ResponseEntity<User> updateUser(
@PathVariable Long id,
@RequestBody UserRequest request) {
User user = new User(id, request.getName(), request.getEmail());
return ResponseEntity.ok(user);
// HTTP 200 OK с обновлённым ресурсом
}
// DELETE запрос
@DeleteMapping("/users/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
// Удаляем пользователя из БД
return ResponseEntity.noContent().build();
// HTTP 204 No Content (успешно, но нет содержимого)
}
}
HTTP/1.1 vs HTTP/2 vs HTTP/3
- HTTP/1.1: Классическая версия, одно соединение для одного запроса (slow)
- HTTP/2: Мультиплексинг, несколько запросов по одному соединению (faster)
- HTTP/3: На основе QUIC, ещё быстрее, но новая (не везде поддерживается)
HTTPS (Защищённый HTTP)
HTTPS = HTTP + SSL/TLS шифрование. Обязателен для:
- Передачи конфиденциальных данных (пароли, токены)
- API в production
- Защиты от перехвата данных
Итог
REST использует HTTP/HTTPS как основной протокол обмена сообщениями. HTTP предоставляет методы (GET, POST, PUT, DELETE), коды состояния (200, 404, 500) и заголовки, которые позволяют реализовать полноценное REST API.