Давайте розберемося з обробкою запитів 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": "Стаття не знайдена"},
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": "Стаття не знайдена"},
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": "Стаття не знайдена"},
status=status.HTTP_404_NOT_FOUND
)
article.delete()
return Response(
{"message": "Статтю видалено"},
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": "Моя перша стаття", "content": "Це контент моєї першої статті." }Запит:
POST /articles/
- PUT-запит: Оновлення існуючої статті.
Тіло запиту:
{ "title": "Оновлений заголовок", "content": "Оновлений контент." }- Запит:
PUT /articles/1/
- DELETE-запит: Видалення статті.
- Запит:
DELETE /articles/1/
Типові помилки
Відсутність перевірки на існування об'єкта. Якщо забути перевірку на існування запису перед оновленням або видаленням, сервер поверне 500 Internal Server Error. Це неінформативно для клієнта, краще повертати 404 як у прикладах вище.
PUT без повної заміни даних. Метод PUT очікує, що ви надішлете всі поля об'єкта. Якщо надіслати неповні дані, це призведе до помилки валідації. Якщо ви хочете замінити лише частину даних, використовуйте метод PATCH.
Відсутність обробки помилок серіалізації. Не забувайте перевіряти
serializer.is_valid()і повертати помилки у відповіді, інакше клієнт не зрозуміє, що пішло не так.
Застосування на практиці
На співбесіді вас можуть запитати: "Як створити endpoint для CRUD-операцій у DRF?" Вихідний код з цієї лекції легко адаптується для більшості подібних задач. Також ви можете використовувати ці приклади у реальних проєктах для швидких і безпечних API.
Сподіваємося, що ви вже почуваєтеся з запитами GET, POST, PUT і DELETE впевнено. Ну, або принаймні точно знаєте, як скласти "ресторанне меню" вашого API!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ