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

Какой протокол обмена сообщениями используется в 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.