Pular para o conteúdo principal

Referência JSON

O REST também sobe via VdrCtrl():Start(jConfig), onde jConfig é um JsonObject com a mesma árvore das seções do appserver.ini. Cada seção INI vira uma chave de primeiro nível; cada chave interna vira propriedade do objeto filho.

Chaves são case-sensitivePortport. Um erro de capitalização impede o start.

Contexto dos dois caminhos: Configuração INI e JSON. Equivalente em INI: Referência INI.

Hierarquia

jConfig
├── HTTPSERVER → Enable, Servers[], Log, Charset
├── <ServerName> → Port, HostName, Locations[], LoadURNs, TlppData, …
├── <LocationName> → Path, RootPath, ThreadPool, CORS, …
├── <ThreadPoolName> → Environment, MinThreads, Slaves[], UserExits
├── <SlaveName> → mesmo formato do thread pool
├── <UserExitsName> → OnStart, OnStop, OnSelect, OnError, OnBlock, OnSend
├── <ContentTypesName> → extensão → MIME type
└── <CORSName> → AllowOrigins[], AllowMethods[]

Referências entre nós usam string com o nome da chave (como no INI). Arrays no JSON substituem listas separadas por vírgula — ex.: Servers := {"HTTP_REST"} em vez de Servers=HTTP_REST.

Equivalência INI ↔ JSON

INIJSON (TLPP)
[HTTPSERVER] Enable=1jConfig['HTTPSERVER']['Enable'] := .T.
Servers=HTTP_RESTjConfig['HTTPSERVER']['Servers'] := {"HTTP_REST"}
[HTTP_REST] port=9995jConfig['HTTP_REST']['Port'] := 9995
locations=HTTP_ROOTjConfig['HTTP_REST']['Locations'] := {"HTTP_ROOT"}
[HTTP_ROOT] Path=/jConfig['HTTP_ROOT']['Path'] := "/"
ThreadPool=THREAD_POOLjConfig['HTTP_ROOT']['ThreadPool'] := "THREAD_POOL"
[THREAD_POOL] Environment=ENVjConfig['THREAD_POOL']['Environment'] := "ENV"
UserExits=MY_UEXjConfig['THREAD_POOL']['UserExits'] := "MY_UEX"
[MY_UEX] OnStart=fnjConfig['MY_UEX']['OnStart'] := "fn"

HTTPSERVER

PropriedadeTipoDescrição
Enablebool.T. = ativo (equivalente a Enable=1)
ServersarrayNomes dos servidores — cada nome é outra chave em jConfig
LogboolLog do HTTP server
CharsetstringCodepage global (padrão UTF-8)

Nó do servidor (<ServerName>)

PropriedadeTipoDescrição
PortintPorta HTTP(S)
HostNamestringHost virtual
LocationsarrayNomes das locations
CharsetstringCodepage deste servidor
ContentTypesstringNome do nó de MIME types
TlppDatastringJSON do framework (auth, OnBlockSoft, etc.) — ver Authorization
UserDatastringJSON livre do desenvolvedor
LoadURNsobjectMapeamento de rotas sem annotation — ver abaixo
SslCertificatestringCaminho do certificado
SslCertificateKeystringChave privada
SslCertificatePassstringSenha da chave (opcional)
SslMethodstringEx.: SSL/TLS

Nó da location (<LocationName>)

PropriedadeTipoDescrição
PathstringPrefixo de URL
RootPathstringArquivos estáticos no disco
DefaultPagearrayPáginas padrão (ex.: {"index.html"})
AllowMethodsstringVerbos permitidos para estáticos
ThreadPoolstringNome do thread pool
CORSarrayNomes dos nós CORS

Nó do thread pool (<ThreadPoolName>)

PropriedadeTipoDescrição
EnvironmentstringAmbiente RPO
MinThreadsintMínimo de threads (> 0)
MaxThreadsintTeto do pool
MinFreeThreadsintThreads ociosas mínimas
GrowthFactorintFator de crescimento
InactiveTimeoutintTimeout inatividade (ms)
AcceptTimeoutintTimeout de aceite (ms)
ActiveTimeoutintTimeout de requisição ativa (ms)
SlavesarrayNomes de pools auxiliares
UserExitsstringNome do nó de callbacks

Slaves (<SlaveName>) repetem as mesmas propriedades do pool principal, sem Slaves aninhados.

UserExits

PropriedadeFunção
OnBlockBloqueia URNs na subida do REST
OnAllowPermite só URNs listadas (lista branca)
OnStartThread criada
OnStopThread encerrada
OnSelectEscolha de slave
OnErrorTratamento de erro
OnSendAntes de enviar a resposta

Detalhes: Callbacks.

ContentTypes e CORS

ContentTypes — objeto com extensão → MIME:

jConfig['MY_TYPES'] := JsonObject():New()
jConfig['MY_TYPES']['json'] := "application/json"
jConfig['MY_TYPES']['html'] := "text/html"
jConfig['HTTP_REST']['ContentTypes'] := "MY_TYPES"

CORS — referenciado na location:

PropriedadeTipoDescrição
AllowOriginsarrayOrigens permitidas
AllowMethodsarrayVerbos HTTP

LoadURNs — rotas sem annotation

O nó LoadURNs fica no servidor, não na location. Estrutura:

LoadURNs
└── "/caminho/:param" ← path completo da URN
└── GET | POST | PUT | … ← verbo HTTP
├── ProgramType 0 = função, 1 = classe/método
├── ClassName
├── Function
└── EndPoint array com segmentos da rota

Guia completo com todos os verbos: Sem annotation.

Logs (global)

As chaves abaixo costumam ficar no appserver.ini (não no jConfig do Start), mas afetam o REST:

ChaveDescrição
rest_log_levelVerbosidade (3–6)
rest_error_fullStack no log de erro
rest_log_stringsizeTamanho máximo do log
rest_reload_timeReleitura de config
rest_trace_timeTimer de trace

VdrCtrl():Start() — retorno

RetornoSignificado
0Servidor iniciado
OutroFalha — consulte oVdrCtrl:nErr e oVdrCtrl:cErr

Exemplos

Estrutura mínima

Equivalente ao INI mínimo:

Local jConfig := JsonObject():New()
Local nResult := 0

jConfig['HTTPSERVER'] := JsonObject():New()
jConfig['HTTPSERVER']['Enable'] := .T.
jConfig['HTTPSERVER']['Servers'] := {"HTTP_REST"}

jConfig['HTTP_REST'] := JsonObject():New()
jConfig['HTTP_REST']['Port'] := 9995
jConfig['HTTP_REST']['HostName'] := "localhost"
jConfig['HTTP_REST']['Locations'] := {"HTTP_ROOT"}

jConfig['HTTP_ROOT'] := JsonObject():New()
jConfig['HTTP_ROOT']['Path'] := "/"
jConfig['HTTP_ROOT']['RootPath'] := "root/web"
jConfig['HTTP_ROOT']['ThreadPool'] := "THREAD_POOL"

jConfig['THREAD_POOL'] := JsonObject():New()
jConfig['THREAD_POOL']['Environment'] := GetEnvServer()
jConfig['THREAD_POOL']['MinThreads'] := 1

nResult := VdrCtrl():New():Start(jConfig)

Serviço com slaves, content-types e LoadURNs

Modelo completo (SSL, CORS, user exits, endpoint manual)

Próximo passo: Avisos e dicas — feche o bloco Servidor e rotas antes de entrar no oREST.