Sobes.tech
Back to questions
Junior — Middle
50

Объясните принципы построения архитектуры веб-приложений с использованием REST, приводя конкретные примеры.

Answer from AI

sobes.tech AI

Архитектура веб-приложений с использованием REST строится на принципах REST (Representational State Transfer), которые обеспечивают простоту, масштабируемость и независимость компонентов.

Основные принципы:

  • Ресурсо-ориентированность: все объекты (пользователи, товары, заказы и т.д.) представлены как ресурсы с уникальными URI.
  • Использование стандартных HTTP-методов:
    • GET — получить ресурс
    • POST — создать новый ресурс
    • PUT — обновить ресурс
    • DELETE — удалить ресурс
  • Статус-коды HTTP для информирования о результате запроса (например, 200 OK, 404 Not Found, 201 Created).
  • Отсутствие состояния (stateless): сервер не хранит состояние клиента между запросами.

Пример:

Пусть есть веб-приложение для управления задачами.

  • Получить список задач: GET /tasks
  • Получить конкретную задачу: GET /tasks/{id}
  • Создать задачу: POST /tasks с телом запроса, содержащим данные задачи
  • Обновить задачу: PUT /tasks/{id} с обновленными данными
  • Удалить задачу: DELETE /tasks/{id}

В Python с использованием Flask это может выглядеть так:

from flask import Flask, request, jsonify
app = Flask(__name__)
tasks = {}

@app.route('/tasks', methods=['GET'])
def get_tasks():
    return jsonify(list(tasks.values()))

@app.route('/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
    task = tasks.get(task_id)
    if task:
        return jsonify(task)
    return '', 404

@app.route('/tasks', methods=['POST'])
def create_task():
    data = request.json
    task_id = len(tasks) + 1
    tasks[task_id] = {'id': task_id, 'name': data['name']}
    return jsonify(tasks[task_id]), 201

@app.route('/tasks/<int:task_id>', methods=['PUT'])
def update_task(task_id):
    if task_id not in tasks:
        return '', 404
    data = request.json
    tasks[task_id].update(data)
    return jsonify(tasks[task_id])

@app.route('/tasks/<int:task_id>', methods=['DELETE'])
def delete_task(task_id):
    if task_id in tasks:
        del tasks[task_id]
        return '', 204
    return '', 404

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

Такой подход упрощает взаимодействие между клиентом и сервером, делает API понятным и стандартизированным.