2020
Базовыми протоколами, на основании которых происходит соединение между браузером и сервером, являются TCP и IP:
В рамках протокола TCP передача данных происходит кусочками, называемыми пакетам. Для передачи одного документа могут потребоваться сотни пакетов
Поверх протокола TCP реализован протокол HTTP, Hyper Text Transport Protocol—базовый протокол для передачи документов
По протоколу HTTP передаются HTML-документы, CSS-документы, JavaScript-документы, JSON-документы и т.д.
Данный протокол выделяет следующие элементы:
В качестве клиентов могут выступать любые приложения, которые реализуют клиентскую часть протокола HTTP
Рассмотрим шаги, которые выполняет клиент во время запроса к серверу
Клиент открывает TCP-соединение с сервером, которое используется для отправки сообщения, приёма ответа
Клиент посылает HTTP-сообщение, например:
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: ru
Сервер отвечает документом на сообщение:
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
...
<!DOCTYPE html...
Клиент закрывает или переиспользует TCP-соединение для другого запроса
GET / HTTP/1.1
Host: uniyar.ac.ru
Accept-Language: ru
GET
—метод (тип запроса)/
—путь по которому осуществляется запросHTTP/1.1
—версия протоколаGET
-запрос на получение документа по ссылкеPOST
-запрос на передачу данных по ссылкеPUT
-запрос на обновление ресурса по ссылкеDELETE
-запрос на удаление ресурса по ссылкеКак и в запросе, каждая строка несёт свою смысловую нагрузку
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
...
HTTP/1.1
—версия протокола, по которому происходит ответ200
—код ответа сервера, указывающий результат обработкиOK
—краткое и неполное описание кода ответаВ протоколе определены следующие группы кодов ответа
100-199
— Информационные ответы200-299
— Успешные ответы300-399
— Перенаправления400-499
— Ошибки в запросе от клиента500-599
— Ошибки в работе сервера200
— запрос был выполнен успешно301
— перенесён на постоянной основе302
— документ временно перенесён404
— документ не найденДля определения пути к документу используется специальный формат, называемый URI, Universal Resource Identifier:
[схема ":"] путь ["?" запрос] ["#" фрагмент]
схема описывает способ связи
file
— файл на локальной файловой системеhttp
— доступ по протоколу HTTPпуть к документу, зависит от схемы
запрос содержит дополнительные параметры
фрагмент выделяет компонент в документе
В основе реализации всего современного серверного HTTP-стека для Ruby приложений лежит библиотека Rack
Без использования Rack каждому веб-серверу потребовалось бы реализовывать поддержку каждой библиотеки для создания веб-приложений
Существует множество веб-серверов: puma
, unicorn
, thin
и т. д., обладающими различными свойствами
На основе библиотеки Rack созданы библиотеки и фреймворки: Ruby on Rails, Sinatra, Hanami, RODA, Cuba
Rack больше всего интересен для разработчиков
Компонент, совместимый с Rack, должен обладать следующими характеристиками:
call
, которому передаётся 1 аргумент — информация о запросе, включающий путь, заголовки, параметры и т.д.Такими компонентами могут выступать лямбда-блоки
Класс Rack::Builder предоставляет предметный язык программирования, который позволяет соединять между собой промежуточные слои
Он предоставляет следующие методы:
use
позволяет подключить промежуточный слойmap
позволяет привязать обработчики к определённым путямrun
запускает приложение для обработки запросовconfig.ru
Джем rack
поставляет приложение rackup
, которое предназначено для запуска Rack-приложений. Его конфигурационный файл — config.ru
'app'
require_relative 'middleware_logger'
require_relative
MiddlewareLogger
use App.new run
RODA — это библиотека, облегчающая написание веб-приложений на Ruby
Ключевые особенности:
Большинство Rack-приложений можно рассматривать как MVC-приложения:
В такой архитектуре к коду, использующему RODA, предъявляются стандартные требования к контроллеру: