Pular para o conteúdo principal

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, ClassName e Function por verbo HTTP

Fluxo em duas etapas

  1. Subir o serviço — monte o JsonObject e chame VdrCtrl():Start(), incluindo o nó LoadURNs.
  2. 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:

Próximo passo: Referência INI — tabela de chaves do appserver.ini antes do caminho JSON completo.