HTTP
Что это
HTTP(HyperText Transfer Protocol) - является протоколом клиент-серверного взаимодействия без сохранения
промежуточного состояния. В роли клиента чаще всего выступает веб-браузер. Для обмена информацией протокол
HTTP в большинстве случаев использует TCP/IP.
Протоколы передачи данных
HTTP(HyperText Transfer Protocol) - протокол прикладного уровня передачи данных, изначально — в виде
гипертекстовых документов в формате HTML, в настоящее время используется для передачи произвольных данных.
Если не указывать порт будет использован стандартный - "80".
HTTPS(HyperText Transfer Protocol Secure) - расширение протокола HTTP для поддержки шифрования в целях
повышения безопасности. Данные в протоколе HTTPS передаются поверх криптографических протоколов
SSL(устаревшего в 2015 году) или TLS(SSL 3.0)(Transport layer security). Если не указывать порт будет
использован стандартный - "443". Для проверки качества TLS/SSL защиты можно использовать ресурс
"ssllabs.com/ssltest/index.html". TLS handshake: 1. ClientHello + SNI.
HTTP запрос структура
- Стартовая строка
- Заголовки
- Request Payload(Request Body) - есть у POST, PUT, PATCH. Нет у HEAD, GET, DELETE.
Значение header не может быть null.
- Host - для указания к какому приложению обращаться, если на сервере есть несколько приложений.
- Content-Type - сообщает передаваемый тип данных с помощью MIME отметок.
HTTP методы
- GET - получение ресурса. Передает данные серверу используя URL(1024 символами).
- POST - создание ресурса.
- PUT - обновление ресурса.
- PATCH - обновляет часть ресурса.
- DELETE - удаление ресурса.
- HEAD - используется для получения метаинформации об объекте без пересылки тела HTTP сообщения.
- OPTIONS - для получения параметров текущего HTTP соединения.
- TRACE - используется для получения информации о том, что происходит с сообщением на промежуточных узлах.
Кеширование
GET и HEAD - кешируемые.
POST - по умолчанию не кэшируются, но можно кэшировать, если к ответу добавить заголовок Expires или
заголовок Cache-Control с директивой, явно разрешающей кэширование.
Коды состояния
- 200 - OK.
- 201 - Created.
- 204 - No Content.
- 400 - Bad Request.
- 401 - Unauthorized - необходима авторизация.
- 403 - Forbidden - нет прав доступа к содержимому.
- 404 - Not Found - ресурс не найден.
REST
REST(Representational State Transfer) - архитектурный стиль(набор правил, подход) для создания API в HTTP.
Правила RESTfull:
- Модель взаимодействия - клиент-сервер. Клиент - л.бой пользователь, сервер - API.
- Многослойность(многоуровневость) - применение промежуточных серверов способно повысить: масштабируемость,
балансировки нагрузки, кэширования и тд. Пример: MVC или микросервисы.
- Отсутствие состояния(клиента) - сервер не хранит данные о запросах. Клиент каждый раз авторизуется.
- Кэширование - для GET и POST(если есть Expires header or a Cache-Control header).
- Единообразие интерфейса.
- Код по требованию(необязательный) - исполнение кода на стороне клиента.
Единообразие интерфейса.
Пример корректного url: http://localhost:9999/restfulservices/v1/users/{id}
В url не должно быть глаголов.
| Операция | URI | HTTP method | Status code | Тело ответа |
| Добавить элемент | POST/PUT | /products | 201 | Созданный элемент |
| Получить элемент | GET | /products/{id} | 200 | Найденный элемент |
| Получить все элементы | GET | /products | 200 | Найденные элементы |
| Обновить часть данных элемента | PATCH | /products/{id} | 204/200(есть тело ответа) | Обновленный элементы |
| Обновить все данные элемента | PUT | /products/{id} | 200 | Обновленный элементы |
| Удалить элемент | DELETE | /products/{id} | 204/200(есть тело ответа, не рекомендуется.) | - |
Robustness principle(Postel’s Law)
Robustness principle
- принцип объясняющий почему лучше не делать проверку на строгую схему протокола передачи. Коротко в запросе
могут быть другие параметры которые будут проигнорированы системой. Коротко - не нужно проверять JSON на
отсутствие других полей. Убирает необходимость синхронизировать релизы зависимых сервисов.
Идемпотентность
Идемпотентность(Idempotency) - это запрос, который выполняется всегда с одним эффектом, но ответ на запрос
может быть разный. Пример "DELETE" первый запрос возвращает 200, а последующие 404. Не идемпотентный HTTP
метод - POST и PATCH.
Стратегии идемпотентности
- Idempotence-Key - retries
- Deterministic ID - API
- Unique constraint - DB
- Event deduplication - очереди
- Upsert - User-friendly
- Optimistic lock - race-condition
Http сессия
Сеанс (сессия) – соединение между клиентом и сервером, устанавливаемое на определенное время, за которое
клиент может отправить на сервер сколько угодно запросов. Так как при посещении клиентом Web-ресурса и
выполнении вариантов запросов, контекстная информация о клиенте не хранится(stateless). В протоколе HTTP нет
возможностей для сохранения и изменения информации о предыдущих посещениях клиента. Каждый клиент
устанавливает с сервером свой собственный сеанс. Сеансы используются для обеспечения хранения данных во
время нескольких запросов Web-страницы или на обработку информации, введенной в пользовательскую форму в
результате нескольких HTTP-соединений.
Данные получаются и сохраняются в сессии при помощи соответствующего "ключа".
Контейнер сервлетов при любом запросе проверяет, есть ли в запросе параметр ID сессии. Если Да(например,
клиент первый раз обращается к серверу), тогда контейнер сервлетов создает новый объект HttpSession,
а также присваивает ему уникальный ID. Объект сессии сохраняется на сервере, а ID отправляется в ответе
клиенту и по умолчанию сохраняется на клиенте в куках. Затем, когда приходит новый запрос от того же клиента,
то контейнер сервлетов достает из него ID, и по этому ID находит правильный объект HttpSession на сервере.
Получить объект сессии можно из запроса (объект HttpServletRequest), у которого нужно вызвать метод
getSession(). Он возвращает объект HttpSession.
Способы обеспечения уникального идентификатора сессии:
- User Authentication – предоставление учетных данных самим пользователем в момент аутентификации.
Переданная таким образом информация в дальнейшем используется для поддержания сеанса. Это метод
не будет работать, если пользователь вошёл в систему одновременно из нескольких мест.
- HTML Hidden Field – присвоение уникального значения скрытому полю HTML страницы, в момент когда
пользователь начинает сеанс. Этот метод не может быть использован со ссылками, потому что нуждается в
подтверждении формы со скрытым полем каждый раз во время формирования запроса. Кроме того, это
не безопасно, т.к. существует возможность простой подмены такого идентификатора.
- URL Rewriting – добавление идентификатора сеанса как параметра URL. Достаточно утомительная операция,
потому что требует постоянного отслеживания этого идентификатора при каждом запросе или ответе.
- Cookies – использование небольших фрагментов данных, отправленных web-сервером и хранимых на устройстве
пользователя. Данный метод не будет работать, если клиент отключает использование cookies.
- Session Management API – использование специального API для отслеживания сеанса, построенный на основе
и на методах, описанных выше. Который решает частные проблемы перечисленных способов -
чаще всего недостаточно просто отслеживать сессию, необходимо ещё и сохранять какие-либо дополнительные
данные о ней. Которые могут потребоваться при обработке последующих запросов. Осуществление такого
поведения требует много дополнительных усилий.
Webhook
Webhook - способ оповещения клиента о событиях с помощью пользовательских обратных вызовов по HTTP.
HTTP POST запрос. Иногда GET.
Основной формат - JSON.
В основной, клиент сам указывает адрес на котором будет ожидать ответ.
Отличение от API
API - требует постоянных вызовов для обновления информации, а Webhook пришлет информацию когда она будет готова.
Способы улучшения производительности:
- Пагинация результатов
- Асинхронная обработка - обработка задач в фоновом режиме без блокировки основного потока выполнения,
что позволяет системе продолжать обработку других запросов.
- Асинхронное логирование - подход предполагает отправку логов в буфер без блокировки и немедленное
возвращение управления, вместо того чтобы записывать данные на диск при каждом вызове. Логи периодически
сбрасываются на диск, что значительно снижает нагрузку на систему ввода-вывода.
- Кэширование данных
- Сжатие payload
- Пул соединений - пула открытых соединений для управления взаимодействием с базой данных, что снижает
накладные расходы, связанные с открытием и закрытием соединений каждый раз, когда требуется загрузить
данные.
- Распределение нагрузки - входящего сетевого трафика между несколькими серверами для предотвращения
перегрузки одного сервера.
- Разделение данных(шардирование) - разделение базы данных на более мелкие части (шарды), которые можно
распределить между несколькими серверами.
- Сети доставки контента(CDA).
- Оптимизация баз данных.
- Параллельная и конкурентная обработка.
- Предварительная и предсказательная загрузка.
Сookies(куки)
Сookies - небольшой фрагмент данных, отправленный web-сервером и хранимый на устройстве пользователя.
Всякий раз при попытке открыть страницу сайта, web-клиент пересылает соответствующие этому сайту cookies
web-серверу в составе HTTP-запроса. Применяется для сохранения данных на стороне пользователя и на
практике обычно используется для:
- Аутентификации пользователя
- Хранения персональных предпочтений и настроек пользователя
- Отслеживания - состояния сеанса доступа пользователя
- Ведения разнообразной статистики