- •Аннотация
- •Cодержание
- •Введение
- •1. Теоретические основы и архитектурные принципы Web-сервисов
- •1.1. Протокол soap и стандарты ws-*
- •1.2. Архитектурный стиль rest
- •1.3. Сравнение форматов данных: xml против json
- •1.4. Сравнительная характеристика подходов
- •2. Проектирование и программная реализация системы
- •2.1. Обоснование выбора стека технологий
- •2.2. Архитектурная организация серверной части
- •2.3. Реализация уровня данных (Data Access Layer)
- •2.4. Реализация soap-сервиса
- •2.5. Реализация rest-сервиса
- •2.6. Реализация клиентского приложения и сбор метрик
- •3. Анализ производительности
- •3.1. Методика тестирования
- •3.2. Результаты тестирования
- •3.2.1. Анализ размера данных (Traffic Overhead)
- •3.2.2. Анализ вычислительной сложности (Parsing Time)
- •3.2.3. Анализ времени загрузки в плохих условиях (Slow 3g)
- •3.3. Итоговое сравнение и выводы
- •Список использованных источников
- •Приложение а Код файла student.Wsdl
- •Листинг программного кода серверной части. Index.Ts
- •Листинг программного кода серверной части. Student.Repository.Ts
- •Листинг программного кода серверной части. Student.Soap.Ts
- •Листинг программного кода серверной части. Rest.Service.Ts
- •Листинг программного кода серверной части. Soap.Service.Ts
- •Листинг программного кода серверной части. ServicePanel.Vue
2.3. Реализация уровня данных (Data Access Layer)
Хранение данных организовано в реляционной базе данных SQLite. Выбор SQLite обусловлен отсутствием необходимости в развертывании отдельного сервера БД, что упрощает переносимость курсовой работы, при этом поддерживая полноценный SQL и транзакции.
Реализован паттерн Repository, инкапсулирующий логику работы с базой данных. Это позволяет бизнес-логике (Service Layer) не зависеть от конкретной СУБД.
Особенности реализации массовой вставки данных (Seeding):
Для корректного сравнения производительности необходимо оперировать большими объемами данных (10 000 – 20 000 записей). Обычная циклическая вставка (INSERT INTO...) в SQLite работает медленно из-за того, что каждый запрос открывает и закрывает файл базы данных.
Для оптимизации был использован механизм транзакций:
Листинг 1 – механизм транзакций
db.serialize(() => {
db.run("BEGIN TRANSACTION");
const stmt = db.prepare("INSERT INTO students (...) VALUES (?, ?, ?)");
for (let i = 0; i < count; i++) {
stmt.run(...);
}
stmt.finalize();
db.run("COMMIT");
});
Данный подход позволил сократить время генерации 20 000 записей с нескольких минут до 1-2 секунд.
2.4. Реализация soap-сервиса
Разработка SOAP-сервиса выполнена по подходу Contract First (сначала контракт). Это означает, что разработка началась с проектирования файла WSDL, который жестко регламентирует типы данных и форматы сообщений.
Структура WSDL-контракта:
Файл student.wsdl определяет:
Сложный тип Student, включающий поля id (int), name (string), specialization (string), course (int).
Операцию getStudents, возвращающую массив элементов (используется атрибут maxOccurs="unbounded").
Операцию createStudent, принимающую параметры и возвращающую созданный объект.
На стороне сервера используется библиотека soap, которая "слушает" определенный маршрут (/soap) и автоматически:
Парсит входящий XML-конверт.
Валидирует его на соответствие WSDL.
Вызывает соответствующую JavaScript-функцию из объекта serviceObject.
Сериализует результат выполнения функции обратно в XML.
2.5. Реализация rest-сервиса
REST-сервис реализован на базе фреймворка Express.js. В отличие от SOAP, здесь отсутствует строгий контракт на уровне протокола. Маршрутизация запросов:
GET /api/students – Получение списка.
POST /api/students – Создание записи.
GET /api/admin/stats – Получение статистики БД.
Для обеспечения CORS (Cross-Origin Resource Sharing) настроены соответствующие заголовки, позволяющие клиентскому приложению (работающему на порту 5173) обращаться к серверу API (порт 8000).
2.6. Реализация клиентского приложения и сбор метрик
Клиентская часть представляет собой SPA (Single Page Application). Основная сложность заключалась в реализации работы с SOAP-протоколом в браузере, так как нативные инструменты (fetch, axios) не поддерживают SOAP "из коробки".
Механизм работы с SOAP на клиенте:
Формирование запроса: XML-конверт формируется вручную с использованием шаблонных строк (Template Literals).
Листинг 2 – использование шаблонных строк
const xml = `<soapenv:Envelope...><tns:getStudentsRequest/></soapenv:Envelope>`;
Отправка: Используется fetch с заголовком Content-Type: text/xml.
Парсинг: Полученная от сервера XML-строка преобразуется в DOM-дерево с помощью DOMParser [7]. Далее происходит ручной обход дерева. Основная трудность заключалась в поиске нужных узлов, так как браузеры по-разному обрабатывают префиксы пространств имен (например, тег может называться tns:students или просто students).
Листинг 3 – итеративный алгоритм для извлечения данных
const nodes = doc.getElementsByTagName('students');
for (let i = 0; i < nodes.length; i++) {
// Ручное извлечение текста из каждого дочернего узла
const id = nodes[i].getElementsByTagName('id')[0]?.textContent;
// Приведение типов (String -> Number)
}
Методика замера производительности:
Для получения объективных данных о производительности была разработана функция-обертка measure. Она фиксирует метки времени с высокой точностью (performance.now()) на трех этапах:
Начало запроса.
Получение сырого ответа (конец сетевой фазы).
Окончание преобразования данных в JavaScript-объекты (конец фазы парсинга).
Это позволило разделить общее время выполнения («Total Duration») на сетевую составляющую («Network Time») и вычислительную составляющую («Parsing Time»), что является ключевым аспектом данного исследования.
