Какова разница между HTTP и REST?

Ответ

HTTP (Hypertext Transfer Protocol) — это протокол прикладного уровня для передачи данных в распределенных информационных системах. Он является основой для обмена данными в World Wide Web. HTTP определяет, как клиенты (например, веб-браузеры) запрашивают данные у серверов и как серверы отвечают на эти запросы.

Ключевые характеристики HTTP:

  • Протокол: Набор правил для форматирования и передачи данных.
  • Методы (Verbs): Определяет действия, которые могут быть выполнены над ресурсом (GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD).
  • Статусы: Коды ответов сервера, указывающие на результат запроса (например, 200 OK, 404 Not Found, 500 Internal Server Error).
  • Без сохранения состояния (Stateless): Каждый запрос обрабатывается независимо, сервер не хранит информацию о предыдущих запросах клиента.

REST (Representational State Transfer) — это архитектурный стиль для проектирования распределенных систем, таких как веб-сервисы. RESTful API используют HTTP как транспортный протокол, но накладывают определенные ограничения и принципы на то, как эти системы должны быть структурированы и взаимодействовать.

Ключевые принципы REST (REST Constraints):

  • Клиент-серверная архитектура: Четкое разделение обязанностей.
  • Отсутствие состояния (Stateless): Каждый запрос от клиента к серверу должен содержать всю необходимую информацию для его обработки.
  • Кэшируемость (Cacheable): Ответы должны быть явно или неявно помечены как кэшируемые или некэшируемые.
  • Единообразие интерфейса (Uniform Interface):
    • Идентификация ресурсов (URI).
    • Манипуляция ресурсами через представления (использование HTTP-методов).
    • Самоописывающие сообщения (включают достаточно информации для обработки).
    • HATEOAS (Hypermedia as the Engine of Application State) — ссылки в ответах, позволяющие клиенту динамически взаимодействовать с API.
  • Многослойная система (Layered System): Клиент не может определить, подключен ли он напрямую к конечному серверу или к посреднику.
  • Код по требованию (Code-On-Demand, опционально): Сервер может временно расширять или настраивать функциональность клиента, передавая исполняемый код.

Взаимосвязь и разница:

  • HTTP — это протокол, который определяет базовые правила передачи данных.
  • REST — это архитектурный стиль, который использует HTTP (и его методы, статусы) для построения масштабируемых, гибких и легко поддерживаемых API, следуя определенным принципам.
  • Все RESTful API используют HTTP, но не все API, использующие HTTP, являются RESTful (они могут не соблюдать все принципы REST).

Пример RESTful API на Python (Flask):

from flask import Flask, jsonify, request

app = Flask(__name__)

# Пример данных, представляющих ресурс "tasks"
tasks = [
    {"id": 1, "title": "Изучить REST API", "done": False},
    {"id": 2, "title": "Написать документацию", "done": True}
]
next_id = 3

@app.route('/tasks', methods=['GET'])
def get_tasks():
    """Получает список всех задач."""
    return jsonify({"tasks": tasks})

@app.route('/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
    """Получает конкретную задачу по ID."""
    task = next((t for t in tasks if t['id'] == task_id), None)
    if task:
        return jsonify({"task": task})
    return jsonify({"message": "Задача не найдена"}), 404

@app.route('/tasks', methods=['POST'])
def create_task():
    """Создает новую задачу."""
    global next_id
    if not request.json or not 'title' in request.json:
        return jsonify({"message": "Отсутствует 'title' в запросе"}), 400
    new_task = {
        'id': next_id,
        'title': request.json['title'],
        'done': request.json.get('done', False)
    }
    tasks.append(new_task)
    next_id += 1
    return jsonify({"task": new_task}), 201 # 201 Created

@app.route('/tasks/<int:task_id>', methods=['PUT'])
def update_task(task_id):
    """Обновляет существующую задачу."""
    task = next((t for t in tasks if t['id'] == task_id), None)
    if not task:
        return jsonify({"message": "Задача не найдена"}), 404
    if not request.json:
        return jsonify({"message": "Пустой запрос"}), 400

    task['title'] = request.json.get('title', task['title'])
    task['done'] = request.json.get('done', task['done'])
    return jsonify({"task": task})

@app.route('/tasks/<int:task_id>', methods=['DELETE'])
def delete_task(task_id):
    """Удаляет задачу."""
    global tasks
    initial_len = len(tasks)
    tasks = [t for t in tasks if t['id'] != task_id]
    if len(tasks) < initial_len:
        return jsonify({"message": "Задача удалена"}), 200
    return jsonify({"message": "Задача не найдена"}), 404

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

Итог: HTTP — это фундаментальный протокол для передачи данных в вебе, а REST — это набор архитектурных принципов, которые используют HTTP для создания структурированных, масштабируемых и легко взаимодействующих веб-сервисов.