как сервер приложений понимает какое приложение должно обработать запрос

Что такое сервер для работы приложения и кому он пригодится?

Сервер для приложений – это framework, используемый для эффективного выполнения процессов, на которых построена программа. Платформа обеспечивает не просто вывод данных, но и оптимизацию исполнения программного кода на разных устройствах.

Сервер для работы приложения – ключевая составляющая ИТ-среды крупных компаний. Если организация нуждается в интеграции своих приложений с корпоративным сайтом и другим софтом (например, мобильными приложениями), быстром доступе к данным со стороны сотрудников, то она сталкивается с необходимостью внедрения одного и пары frameworks.

как сервер приложений понимает какое приложение должно обработать запрос. Смотреть фото как сервер приложений понимает какое приложение должно обработать запрос. Смотреть картинку как сервер приложений понимает какое приложение должно обработать запрос. Картинка про как сервер приложений понимает какое приложение должно обработать запрос. Фото как сервер приложений понимает какое приложение должно обработать запрос

Сервер приложений: что это такое

Программная платформа, используемая для правильного выполнения процедур (программ, скриптов), на которых держится приложение. Она действует как набор компонентов, необходимых разработчику ПО через API, определенный самой платформой.

Для веб-приложений главная задача сервера – обеспечить работу динамических страниц. Дополнительно framework включает в себя балансировку нагрузки, поддержку кластеризации, высокую отказоустойчивость, что позволяет разработчикам заниматься только бизнес-логикой. Они предназначены для многих корпоративных сайтов с высокими требованиями к надежности, к примеру, для приложений, реализующих схемы B2C, B2B, B2E. Application server обеспечивает не просто оперативный вывод данных, но и оптимизацию кода программы на любых устройствах, включая и в android приложениях.

Зачем нужен, где используется и что делает сервер приложений

Рассмотрим пользу и работу application server через наглядный пример. Допустим, вы владеете сайтом, в задачи которого входит предоставление информации пользователям по запросу. Потом решили расширить возможности ресурса, но с подключением ряда опций в браузерах мобильных устройств сайт просто перестал работать.

как сервер приложений понимает какое приложение должно обработать запрос. Смотреть фото как сервер приложений понимает какое приложение должно обработать запрос. Смотреть картинку как сервер приложений понимает какое приложение должно обработать запрос. Картинка про как сервер приложений понимает какое приложение должно обработать запрос. Фото как сервер приложений понимает какое приложение должно обработать запрос

Затем вы решили создать специальный софт для смартфонов и планшетов, который будет поддерживать нормальную работу программы. Но и тут есть нюансы. Дело в том, что «начинка» всех устройств отличается друг от друга, а это ограничивает использование программы.

Для решения этой проблемы весь программный пул разбивается на 3 части:

Пользователь ставит у себя на планшете, допустим, только графическую часть. Она уже направляет запросы на сервер. Данные обрабатываются, а при помощи серверных приложений генерируется код, который затем отправляется обратно в клиентскую программу. Можно сделать вывод, что сервер для запуска приложений обеспечивает выполнение любого кода, который был направлен из графического компонента.

Примеры конфигураций серверов для приложений

Все варианты, указанные в таблице №1, могут применяться по отдельности или в разных комбинациях друг с другом. Каждое окружение имеет разные требования, поэтому нет единой верной конфигурации.

Таблица №1. Примеры конфигураций серверов для приложений

Вид конфигурацииОписаниеПример использованияПлюсыМинусы
1Все находится на одном сервереВ этом случае все окружение будет на сервере. Это сервер БД, web server и application server.Необходим для быстрого развертывания приложения. При этом мало будет возможностей в плане масштабируемости и изоляции компонентов.Простота в использовании.Софт и БД используют одинаковые ресурсы сервера, а это снижает производительность.Трудно выполнять горизонтальное масштабирование.
2Dedicated server баз данныхСУБД может быть отдельно от другого окружения, чтобы убрать конкуренцию за ресурсы сервера между БД и приложениями. Дополнительно выделенный сервер позволяет увеличить безопасность, убрав БД из DMZ, интернета.Аренда сервера для приложения подходит для быстрого развертывания приложения, но при этом помогает убрать проблему борьбы софта и БД за одинаковые системные ресурсыНет конкуренции за ресурсы сервера. Есть вертикальное масштабирование каждого компонента. Можно добавлять дополнительные ресурсы к нужному серверу. Если верно настроить работу сервера, то можно повысить безопасность.Установка более сложная, чем если использовать только один сервер. Могут быть проблемы с производительностью, если пропускная способность недостаточна для передачи данных или сетевое соединение между 2-мя серверами имеет длительное время отклика.
3Балансировщик нагрузкиОбратный прокси используют для увеличения производительности за счет распределения нагрузки между разными серверами. Если один упадет, то другие серверы будут обрабатывать входящий трафик, пока упавший сервер снова не будет работать. Примеры софта − HAProxy, Nginx, и Varnish.Полезен для серверного окружения, которому нужно провести масштабирование путем добавления новых серверов (горизонтальное масштабирование).Ресурсы окружения можно увеличить добавлением новых серверов. Защита от DDOS-атак за счет установления лимита клиентских соединения до нужной частоты и количества.Может стать «больным» местом в производительности, если его неправильно настроить или он испытывает нехватку ресурсов. Появляются сложности, которые нужно устранить администратору. Например, работа с софтом из-за sticky session.
4HTTP AcceleratorНеобходим для снижения времени отклика на запросы пользователя. При этом используются разные методы.Ответы от web server и application server кэшируются в памяти, а после при других запросах на тот же веб сервер для приложения, они быстрее обрабатываются. Примеры такого программного обеспечения − Varnish, Squid, Nginx.Полезно использовать для динамических web server с тяжелым контентом или большим количеством файлов, к которым необходим одновременный доступ.Увеличивается производительность сайта. Можно использовать в виде балансировщика нагрузки. Защита от DDOS атак.Нужны специальные настройки для повышения производительности. Если запросы от пользователей не предполагают использование кэширования данных, то HTTP Accelerator просто снижает производительность сервера.
5Репликация БД по схеме Master-SlaveСхема предполагает наличие одного ведущего и 1+ вспомогательных узлов. Все записи направляются на ведущий узел, а вот запросы на чтение перераспределяются между всеми узлами.Помогает увеличить производительность софта в части обслуживания запросов на чтение из БД.Повышение производительности чтения информации из базы данных.Можно повысить производительность за счет использования ведущего узла только для записи.Сервер для реализации прикладных клиентских приложений, работающий только с БД, должен иметь механизм определения узлов, на которые придется направлять запросы клиентов на чтение и запись. Обновления вспомогательных узлов асинхронны. Есть риск получения не самых свежих данных при запросе. Если главный узел не работает, то данные по запросам не получить, пока не будет исправлена ошибка (при этом нет встроенных резервных средств).

как сервер приложений понимает какое приложение должно обработать запрос. Смотреть фото как сервер приложений понимает какое приложение должно обработать запрос. Смотреть картинку как сервер приложений понимает какое приложение должно обработать запрос. Картинка про как сервер приложений понимает какое приложение должно обработать запрос. Фото как сервер приложений понимает какое приложение должно обработать запрос

Блок вопрос-ответ

В чем отличие веб-сервера от сервера приложений?

Web server – сервер, который занимается обслуживанием статических веб-страниц для пользователей через HTTP. А сервер приложений выполняет некоторые прикладные программы (на нем держится бизнес-логика системы). Он содержит длительно работающие пакетные процессы, службы interop, которые не предназначены для использования человеком (RPC, JSON и др.), отвечает за создание динамического контента посредством выполнения кода на стороне сервера (JSP, Java servlet API или EJB).

Как работает сервер приложений на примере php-приложения?

Если объяснять на пальцах, то на примере php-приложения это выглядит таким образом:
Запрос => Web server (nginx) => Сервер приложений (php-fpm, например) => БД (если этого требует скрипт) => Сервер приложений => Web server => Ответ.

Удобно ли настраивать сервер приложений?

Изменения в настройках application server, как изменение сервера БД или системных настроек, могут проводиться централизованно.

Источник

Сервер приложений и веб-сервер

Сервер приложений (Application Sever) – это сервер промежуточного программного обеспечения (ПО, middleware). Это системное ПО, которое располагается между операционной системой (ОС) с одной стороны, внешними ресурсами, например, системой управления базами данных СУБД (DBMS, Database Management System) или Интернет-сервисами, с другой стороны, и приложениями пользователя.

Сервер приложений действует как хост для бизнес-логики пользователя, он также обеспечивает доступ к бизнес-приложениям и задаёт их параметры для пользователя. Сервер приложений должен устойчиво работать независимо от изменений трафика клиентских запросов, отказов оборудования и ПО, распределённого характера масштабных приложений, а также возможной разнородности форматов данных и ресурсов их обработки.

Внешние ресурсы, например, СУБД и Интернет-сервисы, предоставляют веб-серверы (Web Server). Они отвечает на запросы пользователя по доставке контента.

Серверы приложений иногда путают с веб-серверами. У них есть общие функции, но есть и много различий. Понимание этих различий поможет правильно сконфигурировать программное обеспечение и инфраструктуру оборудования для нужд предприятия.

Различия между серверами приложений и веб-серверами

Параметр сравнения

Веб-сервер

Сервер приложений

Основная цель

Хостинг сайтов и ответы на простые веб-запросы

Хостинг приложений и обеспечение сложных взаимосвязей бизнес-логики

Тип контента

Доставка только статического контента HTML

Доставка как статического, так и динамического контента

Протоколы

HTTP/HTTPS и другие протоколы

Соединение с приложениями

Подключения к базами данных

К статическим базам данных

К базам данных приложений

Типичные клиенты

Веб- и мобильные приложения, а также веб-браузеры

Многопотоковая обработка

Поддерживается параллельная обработка многих запросов

Потребление ресурсов

Трафик не потребляет много ресурсов

Процессы с интенсивным потреблением ресурсов

Контейнеры

Веб-контейнеры (сервлеты, JSP, JSF, веб-сервисы), контейнеры клиентских приложений (DI, безопасность)

Ёмкость

Результат запроса

Гипертекстовый документ, отображающий информацию в браузере

Файлы, содержащие данные, по требованию клиента

Что такое веб-сервер?

Веб-сервер – это компьютерная система, которая хранит, обрабатывает и доставляет веб-страницы для клиента. Клиентом в этом случае является веб-браузер на компьютере пользователя или мобильное приложение на его смартфоне или планшете. В зависимости от настроек, веб-сервер может хранить один или множество веб-сайтов. Веб-серверы доставляют клиенту только статический HTML-контент, такой как документы, изображения, видео, шрифты и пр.

Обычно веб-серверы не обрабатывают динамический контент и не позволяют программировать свои программы. Веб-серверы работают по протоколу передачи гипертекста HTTP (Hypertext Transfer Protocol) или HTTPS (Hypertext Transfer Protocol Secure). Однако, опционально, некоторые веб-серверы позволяют добавлять компоненты, позволяющие работать с динамическим контентом.

как сервер приложений понимает какое приложение должно обработать запрос. Смотреть фото как сервер приложений понимает какое приложение должно обработать запрос. Смотреть картинку как сервер приложений понимает какое приложение должно обработать запрос. Картинка про как сервер приложений понимает какое приложение должно обработать запрос. Фото как сервер приложений понимает какое приложение должно обработать запрос

Что такое сервер приложений?

Сервер приложений (Application Server, App-Server) – это программный комплекс, предназначенный для доставки контента и средств его представления для клиентских приложений. Клиентами могут быть веб-приложения, браузеры или мобильные приложения.

Серверы приложений предоставляют для клиентов бизнес-логику, то есть, преобразуют данные в динамический контент и обеспечивают функционал приложений. Примеры такого контента:

Сервер приложений – это связующее звено между клиентом и программным кодом физического сервера. Типичные задачи сервера приложений:

Серверы приложений также обрабатывают такие процессы, как кластеризация, исправление отказов и балансировка нагрузки.

как сервер приложений понимает какое приложение должно обработать запрос. Смотреть фото как сервер приложений понимает какое приложение должно обработать запрос. Смотреть картинку как сервер приложений понимает какое приложение должно обработать запрос. Картинка про как сервер приложений понимает какое приложение должно обработать запрос. Фото как сервер приложений понимает какое приложение должно обработать запрос

Рис. 2. Сервер приложений.

Что общего у веб-сервера и сервера приложений

Если в качестве основного приложения клиента выступает веб-браузер, то различия между двумя типами серверов размываются. Большинство веб-серверов имеют плагины на основе скриптов (ASP, JSP, JSF, PHP, Perl, и пр.), которые позволяют генерировать динамический контент.

Поскольку в сценариях применения у веб-серверов и серверов приложений много общего, то наиболее популярные серверы являются гибридами этих двух типов. Гибридное решение, совмещающее свойства обеих серверов, обеспечивает максимальную скорость и функциональность системы.

Для хостинга веб-сайта со статическим контентом лучше всего подходят объектные СХД.

Наиболее популярные веб-серверы

Nginx – веб-сервер с открытым кодом, который может работать как обратный прокси-сервер (reverse proxy). Обратный прокси-сервер работает не в сторону клиента, фильтруя контент и обеспечивая безопасность, а в сторону веб-сервера. Nginx имеет архитектуру, управляемую событиями EDA (event-driven architecture), позволяющую создавать и определять события, реагировать на события, измерять потребление ресурсов реакции на событие. Кроме того, он может выполнять функции прокси-сервера электронной почты и балансировщика нагрузки и может выполнять одновременно множество запросов.

HTTP-сервер Apache – популярный веб-сервер на ОС Linux, который входит с стек LAMP (Linux, Apache, MySQL, PHP). На этом веб-сервере работает около 40% Интернет-сайтов. Apache имеет богатый выбор функций, включая htaccess, FTP, HTTP/2, ограничение полосы пропускания для определённых клиентов (throttling), балансировку нагрузки и пр.

Microsoft IIS (Internet Information Services) – свободно распространяемый пакет серверного ПО, представляющий собой проприетарный набор служб от компании Microsoft. IIS распространяется с пакетом Windows NT. IIS поддерживает протоколы HTTP, HTTPS, FTP, POP3, SMTP, NNTP.

Jetty – проект свободного ПО, который может обеспечивать функции НТТР-сервера, НТТР-клиента и контейнера javax.servlet. Хотя Jetty разрабатывался как веб-сервер, он также может служить платформой для межмашинных коммуникаций (М2М).

LiteSpeed имеет хорошую производительность и масштабируемость, широкий диапазон функций и простую в использовании консоль администратора. Это четвёртый по популярности веб-сервер, который, по состоянию на декабрь 2020 года, использовался для 8.1% веб-сайтов.

Наиболее популярные серверы приложений

Apache Tomcat – контейнер сервлетов с открытым исходным кодом на языке Java. Tomcat позволяет запускать веб-приложения и содержит ряд программ для автоматического конфигурирования и часто используется вместе с конфигурационным файлом Apache HTTPD (Apache Hypertext Transfer Protocol Server daemon). Tomcat может исполнять Java-сервлеты, доставлять клиентам страницы в кодах Java Server Page, и может обслуживать приложения Java EE (Java Enterprise Edition).

Сервер Oracle WebLogic – сервер для распределённых приложений с использованием стандартов Java EE. Он полностью интегрирован с продуктами и облачными сервисами Oracle.

Glassfish – сервер приложений с открытым кодом на Java EE, который поддерживает Java-сервлеты, а также спецификацию написания и поддержки серверных компонентов с бизнес-логикой EJB (Enterprise JavaBeans).

JBoss – сервер приложений с открытым кодом для создания, развёртывания и хостинга приложений на языке Java. JBoss может работать на разных платформах и в любой операционной системе с поддержкой Java.

Какой сервер приложений будет наиболее подходящим?

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

Другим подходом может быть добавление функционала в веб-сервер при помощи плагинов. В этом случает, веб-сервер может использовать технологию программирования на стороне сервера (server-side), такую как скрипты CGI, JSP, сервлеты, ASP (Active Server Pages) или JavaScript на стороне сервера.

Использование обоих типов сервера в одной системе

Часто и веб-сервер, и сервер приложений, развёртывают в одной системе. Это даёт возможность предоставлять клиентам как статический, так и динамический контент. В этом случае, веб-сервер становится подсистемой сервера приложений и все их сервисы работают на одной и той же программно-аппаратной платформе.

Преимуществом такого подхода является более высокая производительность системы. В каждом типе сервера максимально используются их преимущества. Простые веб-запросы будут сразу же обрабатываться веб-сервером и при этом не будет снижаться производительность сервера приложений.

Например, на сайте Интернет-магазина должна предоставляться информация о ценах в реальном времени. Обычно на сайте также есть форма для приобретения товара. Когда пользователь посылает запрос, веб-страница магазина ищет актуальную цену и выдаёт результат в виде HTML-страницы. Эту функциональность можно обеспечить как при помощи сервера приложений, так и при помощи веб-сервера с соответствующими плагинами. Возможно несколько сценариев.

Сценарий 1. Использование только веб-сервера с плагинами

Веб-сервер предоставляет функционал Интернет-магазина:

Сценарий 2. Использование как веб-сервера, так и сервера приложений

Сервер приложений хранит бизнес-логику для поиска цены. Веб-сервер делегирует ему генерацию ответа, скрипт вызывает сервис поиска в сервере приложений, и затем формулирует ответ HTML.

Размещение логики поиска цены в сервере приложений позволяет использовать её различными частями приложения. В первом сценарии сервис поиска цены не может повторно использоваться, поскольку данные встроены в HTML-страницу.

как сервер приложений понимает какое приложение должно обработать запрос. Смотреть фото как сервер приложений понимает какое приложение должно обработать запрос. Смотреть картинку как сервер приложений понимает какое приложение должно обработать запрос. Картинка про как сервер приложений понимает какое приложение должно обработать запрос. Фото как сервер приложений понимает какое приложение должно обработать запрос

Рис. 3. Использование как веб-сервера, так и сервера приложений.

Заключение

Пересечение функций веб-сервера и сервера приложений означает, что каждый сценарий применения может иметь несколько решений. Можно применять веб-серверы и серверы приложений отдельно, а можно использовать их комбинацию.

Однако, не каждая конфигурация будет равноценной по параметрам работы и потреблению ресурсов, хотя и будет выполнять возложенные на неё функции. Знание различий между двумя типами серверов поможет сэкономить средства, облегчить масштабирование системы и повысить производительность.

Источник

Грамотная клиент-серверная архитектура: как правильно проектировать и разрабатывать web API

Авторизуйтесь

Грамотная клиент-серверная архитектура: как правильно проектировать и разрабатывать web API

как сервер приложений понимает какое приложение должно обработать запрос. Смотреть фото как сервер приложений понимает какое приложение должно обработать запрос. Смотреть картинку как сервер приложений понимает какое приложение должно обработать запрос. Картинка про как сервер приложений понимает какое приложение должно обработать запрос. Фото как сервер приложений понимает какое приложение должно обработать запрос

Рассказывает Владимир, веб-разработчик Noveo

Большинству разработчиков сайтов, веб-сервисов и мобильных приложений рано или поздно приходится иметь дело с клиент-серверной архитектурой, а именно разрабатывать web API или интегрироваться с ним. Чтобы не изобретать каждый раз что-то новое, важно выработать относительно универсальный подход к проектированию web API, основываясь на опыте разработки подобных систем. Предлагаем вашему вниманию объединенный цикл статей, посвящённых этому вопросу.

Приближение первое: Действующие лица

В один прекрасный момент, в процессе создания очередного веб-сервиса, я решил собрать все свои знания и размышления на тему проектирования web API для обслуживания нужд клиентских приложений и оформить их в виде статьи или серии статей. Разумеется, мой опыт не претендует на абсолют, и конструктивная критика и дополнения более чем приветствуются.

Чтиво получилось больше философское, нежели техническое, но и для любителей технической части здесь будет над чем поразмыслить. Сомневаюсь, что скажу в этой статье что-то принципиально новое, то, о чем вы никогда не слышали, не читали и о чем не думали сами. Просто попытаюсь уложить все в единую систему, в первую очередь в своей собственной голове, а это уже дорогого стоит. Тем не менее, буду рад, если мои измышления будут вам полезны в вашей практике. Итак, поехали.

Клиент и сервер

Сервером в данном случае мы считаем абстрактную машину в сети, способную получить HTTP-запрос, обработать его и вернуть корректный ответ. В контексте данной статьи совершенно не важны его физическая суть и внутренняя архитектура, будь то студенческий ноутбук или огромный кластер из промышленных серверов, разбросанных по всему миру. Нам в той же мере совершенно неважно, что у него под капотом, кто встречает запрос у дверей, Apache или Nginx, какой неведомый зверь, PHP, Python или Ruby выполняет его обработку и формирует ответ, какое хранилище данных используется: Postgresql, MySQL или MongoDB. Главное, чтобы сервер отвечал главному правилу — услышать, понять и простить ответить.

Клиентом тоже может быть все, что угодно, что способно сформировать и отправить HTTP-запрос. До определенного момента в этой статье нам также не особо будут интересны цели, которые ставит перед собой клиент, отправляя этот запрос, как и то, что он будет делать с ответом. Клиентом может быть JavaScript-сценарий, работающий в браузере, мобильное приложение, злой (или не очень) демон, запущенный на сервере, или слишком поумневший холодильник (уже есть и такие).

По большей части мы будем говорить о способе общения между выше перечисленными двумя, таком способе, чтобы они друг друга понимали, и ни у одного не оставалось вопросов.

Философия REST

REST (Representational state transfer) изначально был задуман как простой и однозначный интерфейс для управления данными, предполагавший всего несколько базовых операций с непосредственным сетевым хранилищем (сервером): извлечение данных (GET), сохранение (POST), изменение (PUT/PATCH) и удаление (DELETE). Разумеется, этот перечень всегда сопровождался такими опциями, как обработка ошибок в запросе (корректно ли составлен запрос), разграничение доступа к данным (вдруг этого вам знать не следует) и валидация входящих данных (вдруг вы написали ерунду), в общем, всеми возможными проверками, которые сервер выполняет перед тем, как выполнить желание клиента.

Помимо этого REST имеет ряд архитектурных принципов, перечень которых можно найти в любой другой статье о REST. Пробежимся по ним кратко, чтобы они были под рукой, и не пришлось никуда уходить:

Независимость сервера от клиента — серверы и клиенты могут быть мгновенно заменены другими независимо друг от друга, так как интерфейс между ними не меняется. Сервер не хранит состояний клиента.
Уникальность адресов ресурсов — каждая единица данных (любой степени вложенности) имеет свой собственный уникальный URL, который, по сути, целиком является однозначным идентификатором ресурса.

Пример: GET /api/v1/users/25/name

Независимость формата хранения данных от формата их передачи — сервер может поддерживать несколько различных форматов для передачи одних и тех же данных (JSON, XML и т.д.), но хранит данные в своем внутреннем формате, независимо от поддерживаемых.

Присутствие в ответе всех необходимых метаданных — помимо самих данных сервер должен возвращать детали обработки запроса, например, сообщения об ошибках, различные свойства ресурса, необходимые для дальнейшей работы с ним, например, общее число записей в коллекции для правильного отображения постраничной навигации. Мы еще пройдемся по разновидностям ресурсов.

Чего нам не хватает

как сервер приложений понимает какое приложение должно обработать запрос. Смотреть фото как сервер приложений понимает какое приложение должно обработать запрос. Смотреть картинку как сервер приложений понимает какое приложение должно обработать запрос. Картинка про как сервер приложений понимает какое приложение должно обработать запрос. Фото как сервер приложений понимает какое приложение должно обработать запрос

Классический REST подразумевает работу клиента с сервером как с плоским хранилищем данных, при этом ничего не говорится о связанности и взаимозависимости данных между собой. Все это по умолчанию целиком ложится на плечи клиентского приложения. Однако современные предметные области, для которых разрабатываются системы управления данными, будь то социальные сервисы или системы интернет-маркетинга, подразумевают сложную взаимосвязь между сущностями, хранящимися в базе данных. Поддержка этих связей, т.е. целостности данных, находится в зоне ответственности серверной стороны, в то время, как клиент является только интерфейсом для доступа к этим данным. Так чего же нам не хватает в REST?

Вызовы функций

Чтобы не менять данные и связи между ними вручную, мы просто вызываем у ресурса функцию и «скармливаем» ей в качестве аргумента необходимые данные. Эта операция не подходит под стандарты REST, для нее не существует особого глагола, что заставляет нас, разработчиков, выкручиваться кто во что горазд.

Самый простой пример – авторизация пользователя. Мы вызываем функцию login, передаем ей в качестве аргумента объект, содержащий учетные данные, и в ответ получаем ключ доступа. Что творится с данными на серверной стороне – нас не волнует.

Еще вариант – создание и разрыв связей между данными. Например, добавление пользователя в группу. Вызываем у сущности группа функцию addUser, в качестве параметра передаем объект пользователь, получаем результат.

А еще бывают операции, которые вообще не связаны напрямую с сохранением данных как таковых, например, рассылка уведомлений, подтверждение или отклонение каких-либо операций (завершение отчетного периода etc).

В одной из следующих статей я постараюсь классифицировать эти операции и предложить варианты возможных запросов и ответов, основываясь на том, с какими из них мне приходилось сталкиваться на практике.

Множественные операции

Часто бывает так, и разработчики клиентов поймут, о чем я, что клиентскому приложению удобнее создавать/изменять/удалять/ сразу несколько однородных объектов одним запросом, и по каждому объекту возможен свой вердикт серверной стороны. Тут есть как минимум несколько вариантов: либо все изменения выполнены, либо они выполнены частично (для части объектов), либо произошла ошибка. Ну и стратегий тоже несколько: применять изменения только в случае успеха для всех, либо применять частично, либо откатываться в случае любой ошибки, а это уже тянет на полноценный механизм транзакций.

Для web API, стремящегося к идеалу, тоже хотелось бы как-то привести подобные операции в систему. Постараюсь сделать это в одном из продолжений.

Статистические запросы, агрегаторы, форматирование данных

Частенько бывает так, что на основе хранимых на сервере данных нам нужно получить статистическую выжимку или данные, отформатированные особым образом: например, для построения графика на стороне клиента. По сути это данные, генерируемые по требованию, в той или иной мере на лету, и доступные только для чтения, так что имеет смысл вынести их в отдельную категорию. Одной из отличительных особенностей статистических данных, на мой взгляд, является то, что они не имеют уникального ID.

как сервер приложений понимает какое приложение должно обработать запрос. Смотреть фото как сервер приложений понимает какое приложение должно обработать запрос. Смотреть картинку как сервер приложений понимает какое приложение должно обработать запрос. Картинка про как сервер приложений понимает какое приложение должно обработать запрос. Фото как сервер приложений понимает какое приложение должно обработать запрос

Уверен, что это далеко не все, с чем можно столкнуться при разработке реальных приложений, и буду рад вашим дополнениям и коррективам.

Разновидности данных

Объекты

Ключевым типом данных в общении между клиентом и сервером выступает объект. По сути, объект – это перечень свойств и соответствующих им значений. Мы можем отправить объект на сервер в запросе и получить в результат запроса в виде объекта. При этом объект не обязательно будет реальной сущностью, хранящейся в базе данных, по крайней мере, в том виде, в котором он отправлен или получен. Например, учетные данные для авторизации передаются в виде объекта, но не являются самостоятельной сущностью. Даже хранимые в БД объекты склонны обрастать дополнительными свойствами внутрисистемного характера, например, датами создания и редактирования, различными системными метками и флагами. Свойства объектов могут быть как собственными скалярными значениями, так и содержать связанные объекты и коллекции объектов, которые не являются частью объекта. Часть свойств объектов может быть редактируемой, часть системной, доступной только для чтения, а часть может носить статистический характер и вычисляться на лету (например, количество лайков). Некоторые свойства объекта могут быть скрыты, в зависимости от прав пользователя.

Коллекции объектов

Говоря о коллекциях, мы подразумеваем разновидность серверного ресурса, позволяющую работать с перечнем однородных объектов, т.е. добавлять, удалять, изменять объекты и осуществлять выборку из них. Помимо этого коллекция теоретически может обладать собственными свойствами (например, максимальное число элементов на страницу) и функциями (тут я в замешательстве, но такое тоже было).

Скалярные значения

В одной из следующих статей я постараюсь классифицировать эти операции и предложить варианты возможных запросов и ответов, основываясь на том, с какими из них мне приходилось сталкиваться на практике.

Приближение второе: Правильный путь

В этом приближении я хотел бы отдельно поговорить о подходах к построению уникальных путей к ресурсам и методам вашего web API и о тех архитектурных особенностях приложения, которые влияют на внешний вид этого пути и его компоненты.

О чем стоит подумать, стоя на берегу

как сервер приложений понимает какое приложение должно обработать запрос. Смотреть фото как сервер приложений понимает какое приложение должно обработать запрос. Смотреть картинку как сервер приложений понимает какое приложение должно обработать запрос. Картинка про как сервер приложений понимает какое приложение должно обработать запрос. Фото как сервер приложений понимает какое приложение должно обработать запрос

Версионность

Автономность компонентов

Формат обмена данными

Локализация и многоязычность

Внутренняя маршрутизация

Итак, мы добрались до корневого узла нашего API (или одного из его компонентов). Все дальнейшие маршруты будут проходить уже непосредственно внутри вашего серверного приложения, в соответствии с поддерживаемым им набором ресурсов.

Пути к коллекциям

Элементы коллекции

Уникальные объекты

Свойства объектов и коллекций

Коллекции связанных объектов

Функции объектов и коллекций

Надеюсь, что все более-менее уложилось в систему 🙂 В следующей части мы поговорим подробнее о запросах и ответах, их форматах, кодах статусов.

Приближение третье: Запросы и ответы

В предыдущих приближениях я рассказал о том, как пришла идея собрать и обобщить имеющийся опыт разработки web API. В первой части я постарался описать, с какими видами ресурсов и операций над ними мы имеем дело при проектировании web API. Во второй части были затронуты вопросы построения уникальных URL для обращения к этим ресурсам. А в этом приближении я попробую описать возможные варианты запросов и ответов.

Универсальный ответ

Мы уже проговаривали, что конкретный формат общения сервера с клиентом может быть любым на усмотрение разработчика. Для меня наиболее удобным и наглядным кажется формат JSON, хотя в реальном приложении может быть реализована поддержка нескольких форматов. Сейчас же сосредоточимся на структуре и необходимых атрибутах объекта ответа. Да, все данные, возвращаемые сервером, мы будем оборачивать в специальный контейнер — универсальный объект ответа, который будет содержать всю необходимую сервисную информацию для его дальнейшей обработки. Итак, что это за информация:

Success — маркер успешности выполнения запроса

Для того, чтобы при получении ответа от сервера сразу понять, увенчался ли запрос успехом, и передать его соответствующему обработчику, достаточно использовать маркер успешности «success». Самый простой ответ сервера, не содержащий никаких данных, будет выглядеть так:

Error — сведения об ошибке

В случае, если выполнение запроса завершилось неудачей — о причинах и разновидностях отрицательных ответов сервера поговорим чуть позже, — к ответу добавляется атрибут «error», содержащий в себе HTTP-код статуса и текст сообщения об ошибке. Прошу не путать с сообщениями об ошибках валидации данных для конкретных полей. Правильнее всего, на мой взгляд, возвращать код статуса и в заголовке ответа, но я встречал и другой подход — в заголовке всегда возвращать статус 200 (успех), а детали и возможные данные об ошибках передавать в теле ответа.

Data — данные, возвращаемые сервером

Большинство ответов сервера призваны возвращать данные. В зависимости от типа запроса и его успеха ожидаемый набор данных будет разным, тем не менее атрибут«data» будет присутствовать в подавляющем большинстве ответов.

Пример возвращаемых данных в случае успеха. В данном случае ответ содержит запрашиваемый объект user.

Пример возвращаемых данных в случае ошибки. В данном случае содержит имена полей и сообщения об ошибках валидации.

Pagination — сведения, необходимые для организации постраничной навигации

Помимо собственно данных, в ответах, возвращающих набор элементов коллекции, обязательно должна присутствовать информация о постраничной навигации (пагинации) по результатам запроса.

Минимальный набор значений для пагинации состоит из:

Некоторые разработчики web API также включают в пагинацию набор готовых ссылок на соседние страницы, а также первую, последнюю и текущую.

Работа над ошибками

Как уже упоминалось выше, не все запросы к web API завершаются успехом, но это тоже часть игры. Система информирования об ошибках является мощным инструментом, облегчающим работу клиента и направляющим клиентское приложение по правильному пути. Слово «ошибка» в этом контексте не совсем уместно. Здесь больше подойдёт слово исключение, так как на самом деле запрос успешно получен, проанализирован, и на него возвращается адекватный ответ, объясняющий, почему запрос не может быть выполнен.

Каковы же потенциальные причины получаемых исключений?

500 Internal server error — всё сломалось, но мы скоро починим

Это как раз тот случай, когда проблема произошла на стороне самого сервера, и клиентскому приложению остаётся только вздохнуть и уведомить пользователя о том, что сервер устал и прилёг отдохнуть. Например, утеряно соединение с базой данных или в коде завелся баг.

400 Bad request — а теперь у вас всё сломалось

Ответ прямо противоположный предыдущему. Возвращается в тех случаях, когда клиентское приложение отправляет запрос, который в принципе не может быть корректно обработан, не содержит обязательных параметров или имеет синтаксические ошибки. Обычно это лечится повторным прочтением документации к web API.

401 Unauthorized — незнакомец, назови себя

Для доступа к этому ресурсу требуется авторизация. Разумеется, наличие авторизации не гарантирует того, что ресурс станет доступным, но не авторизовавшись, вы точно этого не узнаете. Возникает, например, при попытке обратиться к закрытой части API или при истечении срока действия текущего токена.

403 Forbidden — вам сюда нельзя

Запрашиваемый ресурс существует, но у пользователя недостаточно прав на его просмотр или модификацию.

404 Not found — по этому адресу никто не живёт

Такой ответ возвращается, как правило, в трёх случаях: путь к ресурсу неверен (ошибочен), запрашиваемый ресурс был удалён и перестал существовать, права текущего пользователя не позволяют ему знать о существовании запрашиваемого ресурса. Например, пока просматривали список товаров, один из них внезапно вышел из моды и был удалён.

405 Method not allowed — нельзя такое делать

Эта разновидность исключения напрямую связана с использованным при запросе глаголом (GET, PUT, POST, DELETE), который, в свою очередь, свидетельствует о действии, которое мы пытаемся совершить с ресурсом. Если запрошенный ресурс не поддерживает указанное действие, сервер говорит об этом прямо.

422 Unprocessable entity — исправьте и пришлите снова

Одно из самых полезных исключений. Возвращается каждый раз, когда в данных запроса существуют логические ошибки. Под данными запроса мы подразумеваем либо набор параметров и соответствующих им значений, переданных методом GET, либо поля объекта, передаваемого в теле запроса методами POST, PUT и DELETE. Если данные не прошли валидацию, сервер в секции «data» возвращает отчет о том, какие именно параметры невалидны и почему.

Протокол HTTP поддерживает намного большее число различных статус-кодов на все случаи жизни, но на практике они используются редко и в контексте web API не несут практической пользы. На моей памяти мне не приходилось выходить за пределы вышеперечисленного списка исключений.

Запросы

Получение элементов коллекции

Одним из наиболее частотных запросов является запрос на получение элементов коллекции. Информационные ленты, списки товаров, различные информационные и статистические таблицы и многое другое клиентское приложение отображает посредством обращения к коллекционным ресурсам. Для осуществления этого запроса мы обращаемся к коллекции, используя метод GET и передавая в строке запроса дополнительные параметры. Как мы уже обозначили выше, в качестве ответа мы ожидаем получить массив однородных элементов коллекции и информацию, необходимую для пагинации — подгрузки продолжения списка или же конкретной его страницы. Содержимое выборки может быть особым способом ограничено и отсортировано с помощью передачи дополнительных параметров. О них и пойдёт речь далее.

Постраничная навигация

page — параметр указывает на то, какая страница должна быть отображена. Если этот параметр не передан, то отображается первая страница. Из первого же успешного ответа сервера будет ясно, сколько страниц имеет коллекция при текущих параметрах фильтрации. Если значение превышает максимальное число страниц, то разумнее всего вернуть ошибку 404 Not found.

perPage — указывает на желаемое число элементов на странице. Как правило, API имеет собственное значение по умолчанию, которое возвращает в качестве поля perPage в секции pagination, но в ряде случаев позволяет увеличивать это значение до разумных пределов, предоставив максимальное значение maxPerPage:

Сортировка результатов

Зачастую результаты выборки требуется упорядочить по возрастанию или убыванию значений определенных полей, которые поддерживают сравнительную (для числовых полей) или алфавитную (для строковых полей) сортировку. Например, нам нужно упорядочить список пользователей по имени или товары по цене. Помимо этого мы можем задать направление сортировки от A до Я или в обратном направлении, причём разное для разных полей.

sortBy — существует несколько подходов к передаче данных о сложной сортировке в GET параметрах. Здесь необходимо четко указать порядок сортировки и направление.

В некоторых API это предлагается сделать в виде строки:

В других вариантах предлагается использовать массив:

В целом оба варианта равносильны, так как передают одни и те же инструкции. На мой взгляд, вариант с массивом более универсален, но тут, как говорится, на вкус и цвет…

Простая фильтрация по значению

Для того, чтобы отфильтровать выборку по значению какого либо поля, в большинстве случаев достаточно передать в качестве фильтрующего параметра имя поля и требуемое значение. Например, мы хотим отфильтровать статьи по ID автора:

Усложнённые варианты фильтрации

Многие интерфейсы требуют более сложной системы фильтрации и поиска. Перечислю основные и наиболее часто встречаемые варианты фильтрации.

Фильтрация по верхней и нижней границе с использованием операторов сравнения from (больше или равно), higher (больше), to (меньше или равно), lower (меньше). Применяется к полям, значения которых поддаются ранжированию.

Фильтрация по нескольким возможным значениям из списка. Применяется к полям, набор возможных значений которых ограничен, например, фильтр по нескольким статусам:

Фильтрация по частичному совпадению строки. Применяется к полям, содержащим текстовые данные или данные, которые могут быть приравнены к текстовым, например, числовые артикулы товаров, номера телефонов и т. д.

Именованные фильтры

В некоторых случаях, когда определенные наборы фильтрационных параметров часто употребимы и подразумеваются системой как нечто целостное, особенно если затрагивают внутреннюю, зачастую сложную механику формирования выборки, целесообразно сгруппировать их в так называемые именованные фильтры. Достаточно передать в запросе имя фильтра, и система построит выборку автоматически.

Именованные фильтры могут также иметь свои параметры.

как сервер приложений понимает какое приложение должно обработать запрос. Смотреть фото как сервер приложений понимает какое приложение должно обработать запрос. Смотреть картинку как сервер приложений понимает какое приложение должно обработать запрос. Картинка про как сервер приложений понимает какое приложение должно обработать запрос. Фото как сервер приложений понимает какое приложение должно обработать запрос

В этом подразделе я постарался рассказать о наиболее популярных вариантах и способах получения требуемой выборки. Скорее всего, в вашей практике наберется намного больше примеров и нюансов касаемо этой темы. Если у вас есть, чем дополнить мой материал, я буду только рад. Тем временем пост уже разросся до солидных масштабов, так что другие виды запросов мы разберём в следующем приближении.

За перевод материала выражаем благодарность международной IT-компании Noveo.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *