Sem annotation
Para rotas dinâmicas ou legado, mapeie endpoints via JSON com LoadURNs — sem @Get / @Post no código.
Quando usar
- URLs geradas em runtime
- Migração de WsRESTful
- Controle fino de
ProgramType,ClassNameeFunctionpor verbo HTTP
Fluxo em duas etapas
- Subir o serviço — monte o
JsonObjecte chameVdrCtrl():Start(), incluindo o nóLoadURNs. - Preencher
LoadURNs— associe path + verbo à função ou método compilado no RPO.
O TDN demonstra isso com u_fInitService() chamando sLoadURNs() antes do start.
1. Inicialização do serviço (fInitService.tlpp)
Thread pool, slaves, content-types e chamada a sLoadURNs no nó LoadURNs:
#include "tlpp-core.th"
Function u_fInitService()
Local oVdrCtrl := VdrCtrl():New() as object
Local cAppPath := "/examples" as character
Local nResult := -1 as integer
Local jConfig := JsonObject():New() as Json
// Obtém o ambiente atual do servidor
Local cEnv := GetEnvServer() as character
// Definição das configurações do HttpServer
jConfig['HTTPSERVER'] := JsonObject():New()
jConfig['HTTPSERVER']['Enable'] := .T.
jConfig['HTTPSERVER']['Log'] := .F.
jConfig['HTTPSERVER']['Charset'] := "ISO-8859-1"
jConfig['HTTPSERVER']['Servers'] := {"INIT_HTTP_REST"}
jConfig['INIT_HTTP_REST'] := JsonObject():New()
jConfig['INIT_HTTP_REST']['Port'] := 9995
jConfig['INIT_HTTP_REST']['HostName'] := "TLPP_REST_SERVER"
jConfig['INIT_HTTP_REST']['Locations'] := {"HTTP_ROOT_01"}
jConfig['INIT_HTTP_REST']['ContentTypes'] := "INIT_ContentTypes"
jConfig['HTTP_ROOT_01'] := JsonObject():new()
jConfig['HTTP_ROOT_01']['Path'] := cAppPath
jConfig['HTTP_ROOT_01']['RootPath'] := "C:\tlppCore\bin\root\web"
jConfig['HTTP_ROOT_01']['DefaultPage'] := {"index.html"}
jConfig['HTTP_ROOT_01']['ThreadPool'] := "INIT_THREAD_POOL_01"
jConfig['INIT_THREAD_POOL_01'] := JsonObject():new()
jConfig['INIT_THREAD_POOL_01']['Environment'] := cEnv
jConfig['INIT_THREAD_POOL_01']['MinThreads'] := 1
jConfig['INIT_THREAD_POOL_01']['MaxThreads'] := 4
jConfig['INIT_THREAD_POOL_01']['MinFreeThreads'] := 0
jConfig['INIT_THREAD_POOL_01']['GrowthFactor'] := 1
jConfig['INIT_THREAD_POOL_01']['AcceptTimeout'] := 10000
jConfig['INIT_THREAD_POOL_01']['InactiveTimeout'] := 30000
jConfig['INIT_THREAD_POOL_01']['ActiveTimeout'] := 120000
jConfig['INIT_THREAD_POOL_01']['Slaves'] := {"TP_AUX_1", "TP_AUX_2"}
jConfig['TP_AUX_1'] := JsonObject():new()
jConfig['TP_AUX_1']['Environment'] := cEnv
jConfig['TP_AUX_1']['MinThreads'] := 2
jConfig['TP_AUX_1']['MaxThreads'] := 4
jConfig['TP_AUX_1']['MinFreeThreads'] := 0
jConfig['TP_AUX_1']['GrowthFactor'] := 1
jConfig['TP_AUX_1']['AcceptTimeout'] := 10000
jConfig['TP_AUX_1']['InactiveTimeout'] := 30000
jConfig['TP_AUX_1']['ActiveTimeout'] := 120000
jConfig['TP_AUX_2'] := JsonObject():new()
jConfig['TP_AUX_2']['Environment'] := cEnv
jConfig['TP_AUX_2']['MinThreads'] := 2
jConfig['TP_AUX_2']['MaxThreads'] := 4
jConfig['TP_AUX_2']['MinFreeThreads'] := 0
jConfig['TP_AUX_2']['GrowthFactor'] := 1
jConfig['TP_AUX_2']['AcceptTimeout'] := 10000
jConfig['TP_AUX_2']['InactiveTimeout'] := 30000
jConfig['TP_AUX_2']['ActiveTimeout'] := 120000
jConfig['INIT_ContentTypes'] := JsonObject():new()
jConfig['INIT_ContentTypes']['htm'] := "text/html"
jConfig['INIT_ContentTypes']['html'] := "text/html"
jConfig['INIT_ContentTypes']['stm'] := "text/html"
jConfig['INIT_ContentTypes']['tsp'] := "text/html"
jConfig['INIT_ContentTypes']['js'] := "text/javascript"
jConfig['INIT_ContentTypes']['json'] := "application/json;charset=utf-8"
jConfig['INIT_ContentTypes']['*'] := "application/octet-stream"
/* -----------------------------------------------------------
2. Mapeamento de URNs (load_urns_no_annotation.tlpp)
Inclui sLoadURNs, handlers por verbo, path param (:myparam), classe/método (ProgramType := 1) e implementações de resposta:
As chaves do objeto de configuração devem coincidir exatamente com as seções INI (case-sensitive). Tabela completa: Referência JSON · equivalente INI: Referência INI.
Exemplos no GitHub
LoadURNs e start sem annotation em Primeiros passos e Configurações:
totvs/tlpp-sample-rest — src/primeiros-passos/load_urns.tlpp
Próximo passo: Referência INI — tabela de chaves do appserver.ini antes do caminho JSON completo.