JavaRush /Курси /Модуль 3: Django /Поняття HTTP-запитів та відповідей

Поняття HTTP-запитів та відповідей

Модуль 3: Django
Рівень 3 , Лекція 7
Відкрита

HTTP (HyperText Transfer Protocol) — це основа спілкування між клієнтом (наприклад, вашим браузером) і сервером (наприклад, нашим Django-додатком). Коли ви відправляєте запит через браузер, ваш клієнт формує HTTP-запит, який сервер обробляє і на основі якого формує HTTP-відповідь.

Приклад запиту, який ви відправляєте кожен день:

  • Ви вводите в адресний рядок https://example.com/articles/42.
  • Браузер відправляє HTTP-запит на сервер.
  • Сервер вирішує, що там ховається під /articles/42, і повертає відповідь (наприклад, HTML-сторінку з потрібною вам статтею).

Простими словами, клієнт каже серверу:
"Гей, дай мені дані за цією адресою!"
А сервер відповідає: "Ось, тримай!", або: "Вибачте, нічого не знайшов!" (привіт, 404).

Структура HTTP-запиту

HTTP-запит складається з:

  1. Методу запиту — вказує серверу, що потрібно зробити з ресурсом (наприклад, прочитати, оновити або видалити).
  2. URL або URI — це частина після імені домену. Наприклад, у https://example.com/articles/42 шлях до ресурсу — /articles/42.
  3. Заголовків — містять додаткову інформацію, таку як тип даних (Content-Type), мова (Accept-Language), авторизація та інше.
  4. Тіла запиту (необов'язково) — містить дані, які ви надсилаєте на сервер (наприклад, дані форми).

Приклад HTTP-запиту мовою "людською":

GET /articles/42 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept-Language: en-US

Методи HTTP-запитів

Django (як і будь-який веб-фреймворк) розуміє основні методи HTTP:

  • GET: найчастіше використовується для отримання даних. Наприклад, при завантаженні статей або перегляді сторінки.
  • POST: використовується для відправки даних на сервер. Наприклад, ви відправляєте форму реєстрації.
  • PUT: оновлює дані на сервері.
  • DELETE: видаляє дані з сервера.
  • PATCH: оновлює частину даних на сервері.

Приклад: уявіть, що ви замовили гамбургер.

  • GET — це коли ви запитуєте, які гамбургери є у меню.
  • POST — це замовлення гамбургера.
  • PUT — це якщо ви вирішите змінити начинку у замовленому гамбургері.
  • DELETE — це скасування вашого замовлення.

Приклад використання методу GET

Створимо просте представлення, яке повертає список статей:

from django.http import JsonResponse

# Функція представлення
def articles_list(request):
    if request.method == "GET":  # Перевіряємо метод запиту
        articles = [
            {"id": 1, "title": "Як вивчити Django"},
            {"id": 2, "title": "Секрети HTTP-протоколу"},
        ]
        return JsonResponse(articles, safe=False)
    else:
        return JsonResponse({"error": "Метод не підтримується"}, status=405)

Додамо маршрут для цього представлення у urls.py:

from django.urls import path
from .views import articles_list

urlpatterns = [
    path('articles/', articles_list, name='articles_list'),
]

Тепер, якщо ви відправите GET-запит на /articles/, сервер поверне вам список статей у форматі JSON. А якщо ви раптом спробуєте POST, отримаєте помилку 405.

Приклад використання методу POST

Тепер додамо можливість додавання статті через POST-запит.

import json
from django.http import JsonResponse

# Функція представлення
def create_article(request):
    if request.method == "POST":
        try:
            body = json.loads(request.body)  # Читаємо тіло запиту
            title = body.get("title")
            if not title:
                return JsonResponse({"error": "Поле 'title' обов'язкове"}, status=400)
            # У реальних проєктах тут записуємо статтю у базу даних
            return JsonResponse({"message": f"Стаття '{title}' створена!"}, status=201)
        except json.JSONDecodeError:
            return JsonResponse({"error": "Неправильний формат JSON"}, status=400)
    else:
        return JsonResponse({"error": "Метод не підтримується"}, status=405)

І додамо маршрут:

urlpatterns += [
    path('create-article/', create_article, name='create_article'),
]

Тепер ви можете відправити POST-запит із тілом:

{
    "title": "Нова стаття про Django!"
}

І сервер відповість: "Стаття 'Нова стаття про Django!' створена!". Записувати у базу поки що не будемо — це тема для майбутніх лекцій.

Що таке HTTP-відповідь?

Після отримання запиту ваш сервер повертає HTTP-відповідь клієнту. Відповіді містять наступне:

  1. Статус-код — вказує результат обробки запиту (наприклад, 200 — все ок, 404 — не знайдено).
  2. Заголовки — додаткова інформація (наприклад, тип контенту або довжина відповіді).
  3. Тіло відповіді — самі дані, які клієнт запитував (наприклад, HTML-сторінка або JSON).

Приклад HTTP-відповіді "людською мовою":

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 50

{"id": 1, "title": "Як вивчити Django"}

Робота з HTTP-відповідями в Django

Django надає можливість повертати дані через HttpResponse та його похідні, такі як JsonResponse.

Приклад простого HTTP-відповіді

from django.http import HttpResponse

def simple_response(request):
    return HttpResponse("Привіт, я простий HTTP-відповідь!")

І додамо маршрут:

urlpatterns += [
    path('simple-response/', simple_response, name='simple_response'),
]

Відкривши /simple-response/, ви побачите текстове повідомлення.

Повернення статус-кодів

Поверніть статус-коди, щоб клієнтам (і їх розробникам) було простіше розібратися, що пішло не так.

from django.http import HttpResponse

def custom_status(request):
    return HttpResponse("Все нормально, але це кастомний статус", status=201)

Маршрут:

urlpatterns += [
    path('custom-status/', custom_status, name='custom_status'),
]

Тут сервер поверне статус-код 201 (Created).

JSON-відповіді

Для роботи з API ми часто повертаємо дані у форматі JSON (дякуємо JsonResponse).

from django.http import JsonResponse

def json_view(request):
    data = {"message": "Привіт, це JSON-відповідь!"}
    return JsonResponse(data)

Маршрут:

urlpatterns += [
    path('json/', json_view, name='json_view'),
]

Ендпоінт /json/ поверне JSON-об'єкт.

Обробка помилок

404: "Сторінка не знайдена"

Якщо користувач стукає в двері вашого додатку не туди (наприклад, /abracadabra/), сервер поверне статус-код 404. Ви можете кастомізувати цю сторінку.

У проєкті створіть 404.html всередині папки templates/:

<h1>Упс, сторінка не знайдена!</h1>
<p>Здається, ви заблукали. Спробуйте повернутися назад.</p>

Django автоматично покаже цей шаблон для всіх 404 помилок.

500: "Внутрішня помилка сервера"

Коли щось йде не так на сервері, користувач бачить сторінку 500. Створіть шаблон 500.html в templates/:

<h1>Ой, щось зламалося!</h1>
<p>Ми вже працюємо над виправленням.</p>

Також Django автоматично підхопить цей шаблон.

Підведемо проміжні підсумки

Сьогодні ми заглибилися в те, як Django працює з HTTP-запитами та відповідями. Дізналися про методи GET і POST, розібралися зі статус-кодами, JSON-відповідями і навіть навчилися обробляти помилки 404 і 500.

Тепер ваш сервер може не тільки приймати запити, але й гарно на них відповідати. Наступний крок — розвивати наш проєкт далі, додаючи потужний функціонал!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ