Давайте разберёмся мы с обработкой запросов GET, POST, PUT и DELETE. Эти методы являются основными строительными блоками REST API, и понимание их работы — фундамент в разработке серверных приложений.
Если представить ваш API как ресторан, то HTTP-методы — это действия, которые вы можете совершать: GET (посмотреть меню), POST (сделать заказ), PUT (отредактировать заказ), DELETE (отменить заказ). Без понимания HTTP-методов ваш API превратится в хаотичную забегаловку, где клиенты будут теряться в догадках, что же делать.
REST API в повседневной разработке используют эти методы для выполнения CRUD (Create, Read, Update, Delete)-операций. Сегодня мы научимся поддерживать все эти методы в представлениях (views) и протестируем их.
Понятие HTTP-методов
Основные HTTP-методы:
- GET — извлечение данных (без изменений).
- POST — создание новых данных.
- PUT — обновление данных (замещение записи целиком).
- PATCH — частичное обновление данных (в этой лекции упомянем вскользь).
- DELETE — удаление данных.
Эти методы определяют, как клиент общается с сервером.
Как создать представления для обработки HTTP-методов?
Мы будем работать с APIView, чтобы поддерживать запросы различных методов. Напомним, что APIView предоставляет базовый интерфейс для обработки запросов HTTP-методов, таких как GET, POST, PUT, DELETE.
Практический пример: работа с моделью Article
Сначала создадим модель Article, если её ещё нет.
# models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
published_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
Не забудьте выполнить миграции.
python manage.py makemigrations
python manage.py migrate
Теперь создадим сериализатор для работы с этой моделью.
# serializers.py
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
Реализация с использованием APIView
Теперь создадим представление с обработкой запросов GET, POST, PUT, DELETE.
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Article
from .serializers import ArticleSerializer
class ArticleAPIView(APIView):
def get(self, request, pk=None):
# Если передан pk, возвращаем конкретную запись
if pk:
try:
article = Article.objects.get(pk=pk)
serializer = ArticleSerializer(article)
return Response(serializer.data)
except Article.DoesNotExist:
return Response(
{"error": "Article not found"},
status=status.HTTP_404_NOT_FOUND
)
# Если pk не передан, возвращаем список записей
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
def post(self, request):
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def put(self, request, pk):
try:
article = Article.objects.get(pk=pk)
except Article.DoesNotExist:
return Response(
{"error": "Article not found"},
status=status.HTTP_404_NOT_FOUND
)
serializer = ArticleSerializer(article, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk):
try:
article = Article.objects.get(pk=pk)
except Article.DoesNotExist:
return Response(
{"error": "Article not found"},
status=status.HTTP_404_NOT_FOUND
)
article.delete()
return Response(
{"message": "Article deleted"},
status=status.HTTP_204_NO_CONTENT
)
Настройка маршрутов
Для работы нашего API добавим маршруты в urls.py.
# urls.py
from django.urls import path
from .views import ArticleAPIView
urlpatterns = [
path('articles/', ArticleAPIView.as_view()),
path('articles/<int:pk>/', ArticleAPIView.as_view()),
]
Тестирование эндпоинтов
Теперь самое интересное — тестирование! Вы можете использовать Postman, curl, или даже встроенный браузер API Django.
- GET-запросы:
Чтобы получить список всех статей:
GET /articles/Чтобы получить конкретную статью:
GET /articles/1/
- POST-запрос: Создание новой статьи.
Тело запроса:
{ "title": "My First Article", "content": "This is the content of my first article." }Запрос:
POST /articles/
- PUT-запрос: Обновление существующей статьи.
Тело запроса:
{ "title": "Updated Title", "content": "Updated content." }- Запрос:
PUT /articles/1/
- DELETE-запрос: Удаление статьи.
- Запрос:
DELETE /articles/1/
Типичные ошибки
Отсутствие проверки на существование объекта. Если забыть проверку на существование записи перед обновлением или удалением, сервер вернёт 500 Internal Server Error. Это неинформативно для клиента, лучше возвращать 404 как в примерах выше.
PUT без полного замещения данных. Метод PUT ожидает, что вы отправите все поля объекта. Если отправить неполные данные, это приведёт к ошибке валидации. Если вы хотите заменить только часть данных, используйте метод PATCH.
Отсутствие обработки ошибок сериализации. Не забывайте проверять
serializer.is_valid()и возвращать ошибки в ответе, иначе клиент не поймёт, что пошло не так.
Применение на практике
На собеседовании вас могут спросить: "Как создать эндпоинт для CRUD-операций в DRF?" Исходный код из этой лекции легко адаптируется для большинства подобных задач. Также вы можете использовать эти примеры в реальных проектах для быстрых и безопасных API.
Надеемся, что вы уже чувствуете себя с запросами GET, POST, PUT и DELETE уверено. Ну, или хотя бы точно знаете, как составить "ресторанное меню" вашего API!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ