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

Зачем нужен POST запрос?

1.0 Junior🔥 211 комментариев
#REST API и HTTP

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

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

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

POST запрос в HTTP

POST — это HTTP метод, который используется для отправки данных на сервер с целью создания нового ресурса или обработки информации. В отличие от GET, POST может передавать большое количество данных и не кэшируется браузером.

Различие между GET и POST

GET запрос:

  • Получает данные с сервера
  • Данные в URL (ограничение 2000-4000 символов)
  • Кэшируется
  • Видна вся информация в адресной строке
  • Используется для извлечения (безопасен)

POST запрос:

  • Отправляет данные на сервер
  • Данные в теле запроса (неограниченно)
  • Не кэшируется
  • Данные скрыты в теле
  • Используется для создания, обновления (изменяет состояние)
import requests

# GET — получить список пользователей
response = requests.get('https://api.example.com/users')
print(response.json())

# POST — создать нового пользователя
data = {
    'name': 'Alice',
    'email': 'alice@example.com',
    'age': 30
}
response = requests.post('https://api.example.com/users', json=data)
print(response.json())  # Возвращает созданного пользователя с ID

Зачем нужен POST

1. Создание новых ресурсов:

# Создание нового поста в блоге
post_data = {
    'title': 'My First Post',
    'content': 'This is the content...',
    'author': 'Alice'
}
response = requests.post('https://api.example.com/posts', json=post_data)
print(response.json())  # {"id": 123, "title": "My First Post", ...}

2. Отправка форм:

# Форма регистрации
form_data = {
    'username': 'alice_smith',
    'password': 'secure_password',
    'email': 'alice@example.com'
}
response = requests.post('https://api.example.com/register', json=form_data)

3. Обновление ресурсов (некоторые системы):

# Обновление профиля пользователя
update_data = {
    'name': 'Alice Johnson',
    'bio': 'Software Developer'
}
response = requests.post(f'https://api.example.com/users/123/update', json=update_data)

4. Проверка данных и обработка:

# Проверка кредитной карты
payment_data = {
    'card_number': '4111111111111111',
    'cvv': '123',
    'amount': 99.99
}
response = requests.post('https://api.example.com/process-payment', json=payment_data)

Структура POST запроса

POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 56

{"name": "Alice", "email": "alice@example.com", "age": 30}
  • Метод: POST
  • Путь: /api/users
  • Заголовки: Content-Type, Content-Length и др.
  • Тело: JSON данные

Content-Type в POST

JSON (самый распространённый):

response = requests.post(
    'https://api.example.com/users',
    json={'name': 'Alice', 'email': 'alice@example.com'}  # Автоматически Content-Type: application/json
)

Form Data (HTML формы):

response = requests.post(
    'https://api.example.com/login',
    data={'username': 'alice', 'password': 'pass123'}  # Content-Type: application/x-www-form-urlencoded
)

Multipart (загрузка файлов):

files = {'file': open('image.jpg', 'rb')}
response = requests.post(
    'https://api.example.com/upload',
    files=files  # Content-Type: multipart/form-data
)

REST API и POST

В REST архитектуре используются разные HTTP методы:

# GET /api/users — получить всех пользователей
response = requests.get('https://api.example.com/users')

# GET /api/users/123 — получить пользователя с ID 123
response = requests.get('https://api.example.com/users/123')

# POST /api/users — создать нового пользователя
response = requests.post('https://api.example.com/users', json={'name': 'Alice'})

# PUT /api/users/123 — полное обновление пользователя
response = requests.put('https://api.example.com/users/123', json={'name': 'Bob'})

# PATCH /api/users/123 — частичное обновление
response = requests.patch('https://api.example.com/users/123', json={'name': 'Bob'})

# DELETE /api/users/123 — удалить пользователя
response = requests.delete('https://api.example.com/users/123')

Пример с Flask (сервер)

from flask import Flask, request, jsonify

app = Flask(__name__)

# GET запрос
@app.route('/api/users', methods=['GET'])
def get_users():
    return jsonify([{'id': 1, 'name': 'Alice'}, {'id': 2, 'name': 'Bob'}])

# POST запрос
@app.route('/api/users', methods=['POST'])
def create_user():
    data = request.get_json()  # Получаем данные из тела POST запроса
    new_user = {
        'id': 3,
        'name': data['name'],
        'email': data['email']
    }
    return jsonify(new_user), 201  # Возвращаем 201 Created

if __name__ == '__main__':
    app.run()

Пример с Django

from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
import json

@require_http_methods(["POST"])
def create_user(request):
    data = json.loads(request.body)
    # Обработка данных
    new_user = {
        'id': 3,
        'name': data.get('name'),
        'email': data.get('email')
    }
    return JsonResponse(new_user, status=201)

Пример с FastAPI (асинхронный)

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class UserCreate(BaseModel):
    name: str
    email: str

@app.post("/api/users")
async def create_user(user: UserCreate):
    new_user = {
        'id': 3,
        'name': user.name,
        'email': user.email
    }
    return new_user

Безопасность POST запросов

HTTPS обязателен:

# Плохо — данные передаются в открытом виде
response = requests.post('http://api.example.com/users', json=data)

# Хорошо — зашифрованное соединение
response = requests.post('https://api.example.com/users', json=data)

Валидация данных на сервере:

from pydantic import BaseModel, EmailStr, validator

class UserCreate(BaseModel):
    name: str
    email: EmailStr
    age: int
    
    @validator('age')
    def age_must_be_positive(cls, v):
        if v < 0:
            raise ValueError('Age cannot be negative')
        return v

Защита от CSRF:

# Django автоматически проверяет CSRF токен
# Flask также имеет встроенную защиту
from flask_wtf.csrf import protect

@app.route('/api/users', methods=['POST'])
@protect()  # Проверка CSRF токена
def create_user():
    pass

Статус коды для POST

# 201 Created — ресурс успешно создан
response = requests.post(url, json=data)
print(response.status_code)  # 201

# 400 Bad Request — неверные данные
# 401 Unauthorized — требуется аутентификация
# 403 Forbidden — нет прав доступа
# 409 Conflict — ресурс уже существует
# 500 Internal Server Error — ошибка на сервере

Выводы

POST используется для:

  • Создания новых ресурсов
  • Отправки данных на сервер
  • Обработки информации
  • Обновления ресурсов
  • Загрузки файлов

Отличия от GET:

  • POST передаёт данные в теле, не в URL
  • POST может передавать больше данных
  • POST не кэшируется
  • POST более безопасен для чувствительных данных
  • POST изменяет состояние на сервере

POST — это фундаментальный HTTP метод для работы с веб-приложениями и API.

Зачем нужен POST запрос? | PrepBro