- •Аннотация
- •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
Листинг программного кода серверной части. Index.Ts
import express from 'express';
import cors from 'cors';
import * as soap from 'soap';
import fs from 'fs';
import path from 'path';
import { restRouter } from '@/routes';
import { soapService } from '@/student/soap/student.soap';
import { initDb } from '@/database';
const app = express();
const PORT = 8000;
initDb();
app.use(cors());
app.use(express.json());
// 1. REST API
app.use('/api', restRouter);
// 2. SOAP API
const wsdlPath = path.join(__dirname, 'student/soap/student.wsdl');
const wsdlXml = fs.readFileSync(wsdlPath, 'utf8');
app.listen(PORT, () => {
soap.listen(app, '/soap', soapService, wsdlXml, () => {
console.log(`Server running on port ${PORT}`);
console.log(`REST Endpoint: http://localhost:${PORT}/api/students`);
console.log(`SOAP WSDL: http://localhost:${PORT}/soap?wsdl`);
});
});
Листинг программного кода серверной части. Student.Repository.Ts
import { db } from '@/database';
import { Student } from './entity/student.entity';
class StudentRepository {
async countAll(): Promise<number> {
return new Promise((resolve, reject) => {
db.get('SELECT COUNT(*) as count FROM students', (err, row: any) => {
if (err) reject(err);
else resolve(row.count);
});
});
}
async findAll(): Promise<Student[]> {
return new Promise((resolve, reject) => {
const sql = 'SELECT * FROM students';
db.all(sql, [], (err, rows) => {
if (err) reject(err);
else resolve(rows as Student[]);
});
});
}
async findById(id: number): Promise<Student | undefined> {
return new Promise((resolve, reject) => {
const sql = 'SELECT * FROM students WHERE id = ?';
db.get(sql, [id], (err, row) => {
if (err) reject(err);
else resolve(row as Student);
});
});
}
async create(data: Omit<Student, 'id'>): Promise<Student> {
return new Promise((resolve, reject) => {
const sql = 'INSERT INTO students (name, specialization, course) VALUES (?, ?, ?)';
db.run(sql, [data.name, data.specialization, data.course], function (err) {
if (err) reject(err);
else resolve({ id: this.lastID, ...data } as Student);
});
});
}
async delete(id: number): Promise<boolean> {
return new Promise((resolve, reject) => {
const sql = 'DELETE FROM students WHERE id = ?';
db.run(sql, [id], function (err) {
if (err) reject(err);
else resolve(this.changes > 0);
});
});
}
async clearAll(): Promise<void> {
return new Promise((resolve, reject) => {
db.run('DELETE FROM students', (err) => {
if (err) reject(err);
else resolve();
});
});
}
async seed(count: number): Promise<void> {
return new Promise((resolve, reject) => {
const specializations = ['IT', 'DevOps', 'QA', 'Design', 'Manager', 'Analyst'];
db.serialize(() => {
db.run('BEGIN TRANSACTION');
const stmt = db.prepare(
'INSERT INTO students (name, specialization, course) VALUES (?, ?, ?)'
);
for (let i = 0; i < count; i++) {
const name = `Student ${Math.floor(Math.random() * 10000)}`;
const spec = specializations[Math.floor(Math.random() * specializations.length)];
const course = Math.floor(Math.random() * 5) + 1;
stmt.run(name, spec, course);
}
stmt.finalize();
db.run('COMMIT', (err) => {
if (err) reject(err);
else resolve();
});
});
});
}
}
export const studentRepository = new StudentRepository();
