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

В чем разница между методами HTTP запросов?

1.2 Junior🔥 181 комментариев
#REST API и микросервисы

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

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

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

Разница между методами HTTP запросов

HTTP методы (также называемые HTTP глаголами) определяют, какое действие нужно выполнить с ресурсом на сервере. Наиболее часто используются GET, POST, PUT, PATCH и DELETE. Каждый метод имеет своё назначение, семантику и особенности.

GET

Назначение: получение данных с сервера.

Характеристики:

  • Безопасный (не изменяет данные на сервере)
  • Идемпотентный (повторные запросы дают одинаковый результат)
  • Параметры передаются в URL (query string)
  • Есть ограничение на длину URL
  • Данные кэшируются браузером
// Пример GET запроса с RestTemplate
RestTemplate restTemplate = new RestTemplate();
String url = "http://api.example.com/users?page=1&limit=10";
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);

// Пример GET запроса с WebClient (Spring WebFlux)
WebClient webClient = WebClient.create();
webClient.get()
    .uri(url)
    .retrieve()
    .bodyToMono(String.class)
    .subscribe(System.out::println);

POST

Назначение: создание новых ресурсов на сервере.

Характеристики:

  • Небезопасный (изменяет состояние на сервере)
  • Не идемпотентный (повторные запросы могут создать дубликаты)
  • Данные передаются в теле запроса
  • Нет ограничения на размер (в отличие от GET)
  • Не кэшируется браузером по умолчанию
  • Возвращает статус 201 Created для успешного создания
// Пример POST запроса с RestTemplate
RestTemplate restTemplate = new RestTemplate();
String url = "http://api.example.com/users";

User newUser = new User("john@example.com", "John Doe");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<User> request = new HttpEntity<>(newUser, headers);
ResponseEntity<User> response = restTemplate.postForEntity(url, request, User.class);

if (response.getStatusCode() == HttpStatus.CREATED) {
    System.out.println("User created: " + response.getBody().getId());
}

// Пример POST с WebClient
WebClient webClient = WebClient.create();
webClient.post()
    .uri(url)
    .contentType(MediaType.APPLICATION_JSON)
    .bodyValue(newUser)
    .retrieve()
    .toEntity(User.class)
    .subscribe(response -> System.out.println(response.getBody().getId()));

PUT

Назначение: замена всего ресурса на сервере.

Характеристики:

  • Небезопасный
  • Идемпотентный (повторные запросы дают одинаковый результат)
  • Заменяет весь ресурс целиком
  • Требует полное представление ресурса
  • Обычно возвращает 200 OK или 204 No Content
// Пример PUT запроса
RestTemplate restTemplate = new RestTemplate();
String url = "http://api.example.com/users/123";

User updatedUser = new User("john.new@example.com", "John Updated");
HttpEntity<User> request = new HttpEntity<>(updatedUser);

restTemplate.put(url, request);
// или с WebClient
WebClient webClient = WebClient.create();
webClient.put()
    .uri(url)
    .contentType(MediaType.APPLICATION_JSON)
    .bodyValue(updatedUser)
    .retrieve()
    .toBodilessEntity()
    .subscribe();

PATCH

Назначение: частичное обновление ресурса.

Характеристики:

  • Небезопасный
  • Может быть идемпотентным или нет (зависит от реализации)
  • Обновляет только переданные поля
  • Эффективнее PUT для частичных обновлений
  • Обычно возвращает 200 OK
// Пример PATCH запроса с WebClient (RestTemplate не поддерживает PATCH напрямую)
WebClient webClient = WebClient.create();
String url = "http://api.example.com/users/123";

Map<String, Object> partialUpdate = new HashMap<>();
partialUpdate.put("email", "newemail@example.com");
// name не обновляется, только email

webClient.patch()
    .uri(url)
    .contentType(MediaType.APPLICATION_JSON)
    .bodyValue(partialUpdate)
    .retrieve()
    .toBodilessEntity()
    .subscribe();

// Альтернатива с RestTemplate через HttpRequest
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters()
    .stream()
    .filter(c -> c instanceof JsonHttpMessageConverter)
    .findFirst()
    .ifPresent(c -> {
        HttpEntity<Map<String, Object>> request = new HttpEntity<>(partialUpdate);
        // Требует использования RequestCallback для PATCH
    });

DELETE

Назначение: удаление ресурса на сервере.

Характеристики:

  • Небезопасный
  • Идемпотентный (удаление несуществующего ресурса безопасно)
  • Параметры в URL
  • Обычно возвращает 200 OK или 204 No Content
// Пример DELETE запроса
RestTemplate restTemplate = new RestTemplate();
String url = "http://api.example.com/users/123";
restTemplate.delete(url);

// С обработкой ошибок
try {
    restTemplate.delete(url);
    System.out.println("User deleted successfully");
} catch (HttpClientErrorException.NotFound e) {
    System.out.println("User not found");
}

// С WebClient
WebClient webClient = WebClient.create();
webClient.delete()
    .uri(url)
    .retrieve()
    .toBodilessEntity()
    .subscribe();

Сравнительная таблица

МетодБезопасныйИдемпотентныйКэшируетсяНаличие bodyСтатус успеха
GET-200 OK
POST201 Created
PUT200 OK
PATCH?200 OK
DELETE-204 No Content

Практические рекомендации

Используй GET для чтения данных, поиска и фильтрации.

Используй POST для создания новых ресурсов, особенно когда нужно много данных.

Используй PUT когда нужно заменить весь ресурс целиком.

Используй PATCH для эффективных частичных обновлений отдельных полей.

Используй DELETE для удаления ресурсов.

Понимание различий между HTTP методами критично для проектирования правильных REST API и эффективной работы с HTTP клиентами в Java.

В чем разница между методами HTTP запросов? | PrepBro