Юниверс DG SDK UI
v2.15.0

Сетевые запросы

Пространство имен Universe.Platform.Network предоставляет базовые классы и интерфейсы для выполнения HTTP-запросов в SDK. Здесь определены основные операции для работы с данными через HTTP протокол, включая загрузку одиночных моделей, списков, файлов и выполнение запросов удаления.

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

Universe.Platform.Network.BaseHttpOp — низкоуровневая операция сетевых запросов, от которой наследуются специализированные классы для разных типов запросов.

Пример операции:

class UploadFileOp extends Universe.Platform.Network.BaseHttpOp {
protected override config: Universe.Platform.Network.IOpConfig = {
url: '/example/upload/',
method: 'post',
model: undefined,
rootProperty: ''
};

constructor (file: File) {
super();

const data = new FormData();

data.append('file', file);

this.config.data = data;
}
}

Universe.Platform.Network.FileHttpOp — операция для загрузки и скачивания файлов.

Типичные случаи использования:

  • Загрузка документов
  • Скачивание отчетов
  • Передача медиафайлов

Пример операции:

export class DownloadFileOp extends Universe.Platform.Network.FileHttpOp {
constructor () {
super();
this.config.url = '/example/download';
}
}

Universe.Platform.Network.ModelHttpOp — операция для загрузки одиночной модели данных. Используется для получения данных конкретной сущности.

Типичные случаи использования:

  • Просмотр или редактирование конкретной записи
  • Загрузка связанного объекта
  • Обновление данных по известному идентификатору

Пример запроса:

GET /universe-backend/api/example/product/1 HTTP/1.1
Host: localhost:8080

Пример ответа:

{
"id": 1,
"name": "Product name 1",
"price": 100
}

Структура данных:

class Product extends Universe.Platform.Model.AbstractModel {    
@Universe.Platform.Model.numberField()
public id: Universe.Platform.Model.NumberField;

@Universe.Platform.Model.stringField()
public name: Universe.Platform.Model.StringField;

@Universe.Platform.Model.numberField()
public price: Universe.Platform.Model.NumberField;
}

Операция для запроса:

export class ReadProductOp extends Universe.Platform.Network.ModelHttpOp<
Product,
never,
Universe.Platform.Model.SerializedType<Product>
> {
protected override config: Universe.Platform.Network.IOpConfig<Product, never> = {
url: '/example/product/{{id}}',
method: 'get',
model: Product,
rootProperty: ''
};

constructor (id: number) {
super();

this.urlContext = {id};
}
}

Обработка запроса:

// Создать операцию
const id = 1;
const operation = new ReadProductListOp(id);

// Выполнить запрос
const product = await operation.execute();

console.log(product.name.getValue()); // 'Product name 1'

Universe.Platform.Network.ModelListHttpOp — операция для загрузки простых списков моделей. Возвращает массив объектов без пагинации. Подходит для загрузки относительно небольших наборов данных, когда не требуется постраничная загрузка.

Типичные случаи использования:

  • Небольшие списки справочных значений
  • Выпадающие списки с фиксированным набором опций
  • Списки связанных объектов для заданной сущности

Пример запроса:

GET /universe-backend/api/example/product/list HTTP/1.1
Host: localhost:8080

Пример ответа:

[
{id: 1, "name": "Product name 1", "price": 100},
{id: 2, "name": "Product name 2", "price": 500}
// ... Other items ...
]

Модель данных сущности:

class Product extends Universe.Platform.Model.AbstractModel {    
@Universe.Platform.Model.numberField()
public id: Universe.Platform.Model.NumberField;

@Universe.Platform.Model.stringField()
public name: Universe.Platform.Model.StringField;

@Universe.Platform.Model.numberField()
public price: Universe.Platform.Model.NumberField;
}

Операция для запроса:

export class ReadProductListOp extends Universe.Platform.Network.ModelListHttpOp<
Product,
never,
Universe.Platform.Model.SerializedType<Product>
> {
protected override config: Universe.Platform.Network.IOpConfig<Product, never> = {
url: '/example/product/list',
method: 'get',
model: Product,
rootProperty: ''
};
}

Обработка запроса:

// Создать операцию
const operation = new ReadProductListOp();

// Выполнить запрос
const products = await operation.execute();

// Результат - массив инициализированных и заполненных данными моделей
console.log(products[0].name.getValue()); // 'Product name 1'

Universe.Platform.Network.ModelListPaginatedHttpOp — операция для загрузки списка моделей с постраничным разбиением. Используется в случаях, когда необходимо загружать большие списки данных частями, указывая смещение (offset) и количество записей на странице (limit).

В отличие от Universe.Platform.Network.ModelListHttpOp, данная операция ожидает от сервера ответ в формате:

type PaginatedResponse<Model> = {
// массив записей на текущей странице
items: SerializedType<Model>[],
// общее количество записей, доступных для загрузки
total: number
}

Типичные случаи использования:

  • Постраничные таблицы с данными
  • Списки с "бесконечной" прокруткой
  • Выпадающие списки с динамической подгрузкой опций

Пример запроса:

GET /universe-backend/api/example/product/list?limit=10&offset=0 HTTP/1.1
Host: localhost:8080

Пример ответа:

{
"items": [
{id: 1, "name": "Product name 1", "price": 100},
{id: 2, "name": "Product name 2", "price": 500}
// ... Other 8 items ...
],
"total": 40
}

Модель данных сущности:

class Product extends Universe.Platform.Model.AbstractModel {    
@Universe.Platform.Model.numberField()
public id: Universe.Platform.Model.NumberField;

@Universe.Platform.Model.stringField()
public name: Universe.Platform.Model.StringField;

@Universe.Platform.Model.numberField()
public price: Universe.Platform.Model.NumberField;
}

Операция для запроса:

export class ReadProductListOp extends Universe.Platform.Network.ModelListPaginatedHttpOp<
Product,
Universe.Platform.Network.PaginationParams,
Universe.Platform.Network.PaginatedResponse<Product>
> {
protected override config: Universe.Platform.Network.IOpConfig<Product> = {
url: '/example/product/list',
method: 'get',
model: Product,
rootProperty: ''
};

constructor (params: Universe.Platform.Network.PaginationParams) {
super();

this.config.params = params;
}
}

Обработка запроса:

// Создать операцию
const operation = new ReadProductListOp({limit: 10, offset: 0});

// Выполнить запрос
const {total, items} = await operation.execute();

console.log(total); // 40
console.log(items.length); // 10
console.log(items[0].name.getValue()); // 'Product name 1'

Universe.Platform.Network.DeleteHttpOp - операция для отправки запросов удаления.

Пример запроса:

DELETE /universe-backend/api/example/product/1 HTTP/1.1
Host: localhost:8080

Операция для запроса:

export class DeleteProductOp extends Universe.Platform.Network.DeleteHttpOp {
constructor (id: number) {
super();
this.config.url = '/example/product/{{id}}';
this.urlContext = {id};
}
}

Обработка запроса:

// Создать операцию
const id = 1;
const operation = new DeleteProductListOp(id);

// Выполнить запрос
await operation.execute();

Universe.Platform.Network.ServerUrlManager — утилита для работы с URL-адресами серверной части приложения. Предоставляет централизованное управление базовыми URL и версиями API для формирования корректных адресов запросов.

  • Universe.Platform.Network.ServerUrlManager.getBaseUrl — Получить базовый URL бэкенда:

    const baseUrl = Universe.Platform.Network.ServerUrlManager.getBaseUrl();
    console.log(baseUrl); // 'http://localhost:8080/universe-backend/api/'
  • Universe.Platform.Network.ServerUrlManager.buildUrl — Сформировать полный URL:

    // относительный путь (endpoint) запроса
    const postUrl = 'example/product/1';

    const url1 = Universe.Platform.Network.ServerUrlManager.buildUrl(postUrl);
    console.log(url1); // 'http://localhost:8080/universe-backend/api/v2/example/product/1'

    // Необязательная версия API (по умолчанию используется текущая)
    const apiVersion = 'v1';

    const url2 = Universe.Platform.Network.ServerUrlManager.buildUrl(postUrl, apiVersion);
    console.log(url2); // 'http://localhost:8080/universe-backend/api/v1/example/product/1'
  • Universe.Platform.Network.ServerUrlManager.getApiVersion — Получить текущую используемую версию API:

    const apiVersion = Universe.Platform.Network.ServerUrlManager.getApiVersion();
    console.log(apiVersion); // 'v2'