Ответ
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 для создания структурированных, масштабируемых и легко взаимодействующих веб-сервисов.