QUrlService
QUrlService - построение адресов, зависящих от окружения
Создадим необходимое количество API-сервисов. Каждый домен должен быть связан со своим QUrlService:
import { QUrlService } from '@diasoft/qpalette-urls';
export class UrlServiceZero extends QUrlService {}
export class UrlServiceOne extends QUrlService {}
export class UrlServiceTwo extends QUrlService {}
export class UrlServiceThree extends QUrlService {}
export class UrlServiceFour extends QUrlService {}
ВAppModule
укажем провайдеры для всех этих сервисов:
import { QCoreService } from '@diasoft/qpalette-core';
import { QUrlService } from '@diasoft/qpalette-urls';
// Можем задать baseUrl прям в коде
const baseUrl = 'https://some-subdomain.$service.$domain/';
@NgModule({
providers: [
{ provide: UrlServiceZero, useFactory: () => new QUrlService() }, // default
{ provide: UrlServiceOne, useFactory: () => new QUrlService( { baseUrl: QCoreService.config.apiBaseUrl }) }, // config from config.json
{ provide: UrlServiceTwo, useFactory: () => new QUrlService({ serviceName: 'service-two' }) },
{ provide: UrlServiceThree, useFactory: () => new QUrlService({ baseUrl }) }, // some url
{ provide: UrlServiceFour, useFactory: () => new QUrlService({ baseUrl, serviceName: 'service-three' }) },
],
...
})
export class AppModule {
...
}
И API-сервис:
@Injectable({ providedIn: 'root' })
export class SomeApiService {
constructor(
private urlServiceZero: UrlServiceZero,
private urlServiceOne: UrlServiceOne,
private urlServiceTwo: UrlServiceTwo,
private urlServiceThree: UrlServiceThree,
private urlServiceFour: UrlServiceFour,
) {
const url1 = this.urlServiceZero.url('/foo/bar');
// /foo/bar
const url2 = this.urlServiceOne.service('service-one', '/foo/bar');
// /api/service-one/foo/bar
const url3 = this.urlServiceTwo.url('/bar/foo');
// /service-two/bar/foo
const url4 = this.urlServiceThree.service('service-three', '/bar/foo');
// https://some-subdomain.service-three.localhost/bar/foo
const url5 = this.urlServiceFour.url('/bar/foo');
// https://some-subdomain.service-three.localhost/bar/foo
}
}
Об URL паттернах
Это строка с переменными параметрами, зависящими от окружения. Переменные параметры подставляются автоматически в момент выполнения запроса.
Пример паттерна:
$protocol://mdpgateway.$domain[4].$domain[3].$domain[2].$domain[1]
Подставляемые переменные:
$protocol
- подставит текущий протокол$port
- подставит текущий порт$domain
- подставит текущий домен целиком$domain[N]
- подставит N уровень домена (например, для mail.google.com,$domain[1] = com
,$domain[2] = google
,$domain[3] = mail
)$service
- подставит название сервиса из menu.json$component
- подставит название компонента из menu.json
Пример конфигурации
{
"tabs": {
"visible": true,
"appName": "Q.Palette"
},
"sidebar": {
"visible": true,
"dynamicMenu": true,
"logo": "",
"logoSmall": ""
},
"feedback": false,
"loginForm": {
"visible": true,
"background": "var(--q-primary-900) center / cover url('assets/images/auth_bg.svg')",
"logo": "assets/images/digitalq_logo.svg"
},
"bundleLoader": {
"loadingAnimation": "assets/images/loading-bundle.svg",
"bundleUrl": "/api/$service/$component/main.js"
},
"widgetLoader": {
"bundleUrl": "/api/$service/widgets/$component/main.js"
},
"auth": {
"service": "default",
"options": {
"redirectOnLogoutUrl": null,
"excludeUrlsFromAuthorization": [
"assets/*"
],
"authDataServiceConfig": {
"urls": {
"base": "/api"
}
}
}
},
"apiBaseUrl": "/api/$service"
}