REST v31 20220708 - 230205
REST v31 20220708 - 230205
REST v31 20220708 - 230205
Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
REST
TOTVSTEC
Table of Contents
1 REST server (tlppCore)......................................................................................21
2 1 - Primeiros Passos ..........................................................................................25
2.1 A - Configuração básica ......................................................................................................... 25
2.1.1 Via INI .................................................................................................................................................................... 25
2.1.1.1 Configuração Rest Server TLPP via INI................................................................................................................ 25
2.1.2 Via JSON ( código fonte ) ..................................................................................................................................... 27
2.1.2.1 Configuração Rest Server TLPP via JSON ........................................................................................................... 27
2.2 B - Ambiente de compilação do TLPP................................................................................... 33
2.2.1 Ambiente de desenvolvimento do TL++ ............................................................................................................. 33
2.2.1.1 Extraindo os includes........................................................................................................................................... 33
2.3 C - Criando primeiro serviço ( Hello World ).......................................................................... 34
2.3.1 Meu primeiro programa....................................................................................................................................... 34
2.3.1.1 Utilizando função................................................................................................................................................. 34
2.3.1.2 Utilizando classe .................................................................................................................................................. 35
2.3.1.3 Explicando os componentes ............................................................................................................................... 35
2.4 D - Entendendo a composição da URL.................................................................................. 36
2.4.1 HOST | (http://127.0.0.1:8080/) e (https://127.0.0.1:444/).................................................................................. 37
2.4.1.1 Protocolo | (http://) e (https://) ........................................................................................................................... 37
2.4.1.2 Porta | (:8080) e (:444) .......................................................................................................................................... 38
2.4.2 Path Virtual | (/totvs) ............................................................................................................................................ 38
2.4.3 Endpoint | (/api/sample)...................................................................................................................................... 39
2.4.3.1 Annotation............................................................................................................................................................ 39
2.4.3.2 JSON ..................................................................................................................................................................... 39
2.4.4 Parâmetros via Query String | (param1=value) .................................................................................................. 39
3 2 - Configurações Avançadas............................................................................40
3.1 A - Verbos/Métodos disponíveis (@annotation)................................................................... 40
3.1.1 @DELETE()............................................................................................................................................................ 42
3.1.1.1 Exemplo utilizando função e recebendo parâmetro via path param ............................................................... 42
3.1.1.2 Exemplo utilizando função recebendo parâmetro via query string.................................................................. 43
3.1.1.3 Exemplo utilizando classe com métodos e recebendo parâmetro via path param e query string. ................ 43
3.1.2 @GET() .................................................................................................................................................................. 44
3.1.2.1 Exemplo utilizando função e recebendo parâmetro via path param ............................................................... 44
– 2
TOTVSTEC – REST
3.1.2.3 Exemplo utilizando classe com métodos recebendo parâmetro via path param e query string. ................... 45
3.1.3 @PATCH() ............................................................................................................................................................. 46
3.1.3.1 Exemplo utilizando função e recebendo parâmetro via path param ............................................................... 46
3.1.3.2 Exemplo utilizando função e recebendo parâmetro via query string............................................................... 47
3.1.3.3 Exemplo utilizando classe com métodos recebendo parâmetro via path param e query string. ................... 47
3.1.4 @POST() ............................................................................................................................................................... 48
3.1.4.1 Exemplo utilizando função e recebendo parâmetro via path param ............................................................... 48
3.1.4.2 Exemplo utilizando função e recebendo parâmetro via query string............................................................... 49
3.1.4.3 Exemplo utilizando classe com métodos recebendo parâmetro via path param e query string. ................... 49
3.1.5 @PUT().................................................................................................................................................................. 50
3.1.5.1 Exemplo utilizando função e recebendo parâmetro via path param ............................................................... 51
3.1.5.2 Exemplo utilizando função recebendo parâmetro via query string.................................................................. 51
3.1.5.3 Exemplo utilizando classe com métodos recebendo parâmetro via path param e query string. ................... 52
3.2 B - Serviços sem uso de @Annotation .................................................................................. 53
3.2.1 Inicialização de um serviço REST ........................................................................................................................ 53
3.2.2 Vinculando a URN à API ....................................................................................................................................... 54
3.2.2.1 OBSERVAÇÃO........................................................................................................................................................ 55
3.3 C - Configuração completa .................................................................................................... 56
3.3.1 Charset.................................................................................................................................................................. 57
3.3.2 ContentTypes (Sessão) ........................................................................................................................................ 58
3.3.2.1 Exemplos de configuração .................................................................................................................................. 59
3.3.3 HTTPSERVER (sessão).......................................................................................................................................... 59
3.3.3.1 Chaves da sessão ................................................................................................................................................. 59
3.3.3.2 Exemplos de ativação .......................................................................................................................................... 60
3.3.4 locations (chave) .................................................................................................................................................. 61
3.3.4.1 Exemplos de configuração - 1 {locations} somente ........................................................................................... 61
3.3.4.2 Exemplos de configuração - 2 {locations}........................................................................................................... 61
3.3.5 LOCATIONS (Sessão)............................................................................................................................................ 62
3.3.5.1 Chaves da sessão ................................................................................................................................................. 62
3.3.5.2 Exemplos de configuração .................................................................................................................................. 63
3.3.6 servers (chave) ..................................................................................................................................................... 63
3.3.6.1 Exemplos de configuração - 1 {servers} somente............................................................................................... 63
3.3.6.2 Exemplos de configuração - 2 {servers} .............................................................................................................. 64
3.3.7 SERVERS (Sessão) ................................................................................................................................................ 64
– 3
TOTVSTEC – REST
4 3 - Funções de Usuário......................................................................................82
4.1 onError.................................................................................................................................... 82
4.1.1 Parâmetros........................................................................................................................................................... 82
4.1.2 Retorno ................................................................................................................................................................. 82
4.1.3 Exemplo................................................................................................................................................................ 82
4.2 onSelect.................................................................................................................................. 83
4.2.1 Parâmetros........................................................................................................................................................... 83
4.2.2 Retorno ................................................................................................................................................................. 84
4.2.3 Exemplo................................................................................................................................................................ 84
4.3 onStart.................................................................................................................................... 85
– 4
TOTVSTEC – REST
4.3.1 Parâmetros........................................................................................................................................................... 85
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
– 5
TOTVSTEC – REST
– 6
TOTVSTEC – REST
– 7
TOTVSTEC – REST
– 8
TOTVSTEC – REST
– 9
TOTVSTEC – REST
– 10
TOTVSTEC – REST
– 11
TOTVSTEC – REST
– 12
TOTVSTEC – REST
– 13
TOTVSTEC – REST
– 14
TOTVSTEC – REST
– 15
TOTVSTEC – REST
– 16
TOTVSTEC – REST
– 17
TOTVSTEC – REST
– 18
TOTVSTEC – REST
6 5 - APIs .............................................................................................................172
6.1 Configuração em tempo real............................................................................................... 172
6.1.1 Como utilizar ...................................................................................................................................................... 172
6.2 Lista de Serviços disponíveis............................................................................................... 173
6.2.1 Como utilizar ...................................................................................................................................................... 173
6.2.1.1 Via User Function ............................................................................................................................................... 174
6.2.1.2 Via Classe ............................................................................................................................................................ 174
6.2.2 Funcionamento.................................................................................................................................................. 175
6.3 Métricas de tempos.............................................................................................................. 175
6.3.1 Como utilizar ...................................................................................................................................................... 175
6.3.1.1 Utilizando User Function. .................................................................................................................................. 178
6.3.1.2 Utilizando Classe................................................................................................................................................ 178
6.3.2 Funcionamento.................................................................................................................................................. 179
6.4 Monitoramento .................................................................................................................... 179
6.4.1 Monitoramento .................................................................................................................................................. 179
6.4.1.1 Como utilizar ...................................................................................................................................................... 179
6.4.1.2 Funcionamento.................................................................................................................................................. 182
6.5 Versão ................................................................................................................................... 182
6.5.1 Como utilizar ...................................................................................................................................................... 182
6.5.1.1 /totvs/environment............................................................................................................................................ 183
6.5.1.2 Utilizando User Function. .................................................................................................................................. 183
6.5.1.3 Utilizando Classe................................................................................................................................................ 184
6.5.2 Funcionamento.................................................................................................................................................. 185
7 6 - Exemplos práticos......................................................................................186
7.1 CRUD..................................................................................................................................... 186
7.2 Migração WsRESTful para REST tlppCore ........................................................................... 186
7.2.1 Como migrar um REST em FWREST para uso com Annotation (tlppCore) ..................................................... 186
7.2.1.1 Características.................................................................................................................................................... 187
7.2.1.2 Resumo das mudanças...................................................................................................................................... 187
7.2.1.3 Exemplos ............................................................................................................................................................ 190
8 Authentication ................................................................................................194
8.1 oAuth .................................................................................................................................... 194
– 19
TOTVSTEC – REST
– 20
TOTVSTEC – REST
REST que significa Representational State Transfer, trata-se de uma abstração da arquitetura da Web.
Para saber mais detalhes sobre REST, sugerimos ler a publicação em nosso blog1.
A linguagem TL++ chega trazendo alguns pontos interessantes a serem considerados quando falamos desta
tecnologia, tais como :
• Um server nativo no servidor de aplicação (Appserver), proporcionando ganho de performance e
estabilidade.
• Simplicidade na implementação das aplicações através do uso de Reflections e Annotations2 , possibilitando
que aplicações possam ser escritas em fontes separados.
• Configuração, início e parada do serviço, tudo através de código fonte. Obviamente que o modo (INI)
tradicional é mantido.
• Manipulação das configurações do REST Server sem a necessidade de parada do serviço, através de API.
Para que seja possível usufruir dos benefícios citados acima e muitos outros proporcionados pela linguagem TL++
para o desenvolvimento de uma aplicação REST sugerimos que sejam seguidos os passos abaixo:
1 https://www.totvs.com/blog/developers/rest/
2 https://tdn.totvs.com/display/tec/Reflection+e+Annotation
2 1 - Primeiros Passos
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
[HTTP_REST]
hostname=localhost
port=9995
locations=HTTP_ROOT
[HTTP_ROOT]
Path=/
RootPath=root/web
ThreadPool=THREAD_POOL
[THREAD_POOL]
1 - Primeiros Passos – 25
TOTVSTEC – REST
Environment=ENV
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
MinThreads=1
Explicando brevemente
1. HTTPSERVER
Aqui são definidas as configurações básicas para funcionamento do Rest Server.
Enable integer X
Servers string X
Chaves da sessão
Enable
Define se o HttpServer será ativado ao iniciar o Appserver.
1 = Ativado
0 = Destativado
Servers
Lista não vazia com os nomes dos servidores que serão ativados no start do server. Os nomes definidos nesta chave
devem ser utilizados na próxima sessão SERVERS.
2. SERVIDORES
Define as configurações de cada servidor HTTP e/ou HTTPS
Em nosso exemplo, foi usado o valor: HTTP_REST
Chave Tipo Obrigatório
Port integer X
Hostname string X
Locations string/ X
Chaves da sessão
Port
Define a porta em que o servidor será ativado.
Hostname
Define o nome virtual para o servidor que será ativado.
Locations
Define o nome das sessões(locations) deste servidor. O(s) nome(s) definido(s) nesta chave deverão utilizado(s) na
chave LOCATIONS.
1 - Primeiros Passos – 26
TOTVSTEC – REST
3. LOCATIONS
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Path string X
RootPath string X
ThreadPool string X
Chaves da sessão
Path
Path da URL que identificará o site.
RootPath
Path onde estarão os arquivos das páginas estáticas.
ThreadPool
Define qual o thread pool irá executar as requisições desta location. O nome definido nesta chave deverá ser
utilizado na sessão THREADPOOL.
4. THREADPOOL
Define as configurações do thread pool, o ambiente e as características das threads.
Em nosso exemplo, foi usado o valor: THREAD_POOL
Chave Tipo Obrigatório
Environment string X
MinThreads integer X
Chaves da sessão
Environment
Esta chave define o environment(ambiente) onde o REST será executado.
MinThreads
Indica a quantidade mínima de threads ativas no thread pool. O valor declarado deve ser maior que zero.
1 - Primeiros Passos – 27
TOTVSTEC – REST
O REST server disponibiliza o recurso de subir um serviço REST através de execução dinâmica, ou seja, após a
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
subida completa do servidor é possível indicar a subida de mais serviços REST a hora que desejar.
Esse modo é feito através de código-fonte e no processo de subida é preciso informar a configuração desejada
através de um JSON.
Segue exemplo:
#include "tlpp-core.th"
/*
* Uso: rest.u_start
*/
namespace rest
Function u_start()
Local oVdrCtrl := Nil
Local nResult := 0
Local jo := Nil
Local cEnv := ""
Local cURLTest := ""
Local cURLTest2 := ""
Local cURLTest3 := ""
Local cGetWithoutAnnot := "test_without_annotation"
Local cGetPath := "/" + cGetWithoutAnnot
// Sessoes
Local sSS_HTTPSERVER := "HTTPSERVER"
Local sSS_ServerName := "TEST_REST_SERVER"
Local sSS_Location := "TEST_REST_LOCATION"
Local sSS_ThreadPool := "TEST_REST_THREADPOOL"
Local sSS_ContentTypes := "TEST_REST_CONTENTTYPES"
Local sSS_Slave01 := "TEST_REST_SLAVE01"
Local sSS_CORS := ""
// Variaveis
Local cAppPath := "/rest"
Local cAppRootPath := "C:\tlppCore\bin\root\web"
Local nAppPort := 10002
1 - Primeiros Passos – 28
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
// Obtem o environment
cEnv := GetEnvServer()
//------------------------------------------------------------------------------
// Cria o objeto de start do Server
oVdrCtrl := VdrCtrl():New()
jo[sSS_HTTPSERVER] := JsonObject():new()
jo[sSS_HTTPSERVER]['Log'] := .F.
jo[sSS_HTTPSERVER]['Servers'] := {sSS_ServerName}
jo[sSS_ServerName] := JsonObject():new()
jo[sSS_ServerName]['HostName'] := "Meu servidor rest"
jo[sSS_ServerName]['Port'] := nAppPort
jo[sSS_ServerName]['Charset'] := "UTF8"
jo[sSS_ServerName]['Locations'] := {sSS_Location}
If(!Empty(cAppSSL_Certificate))
jo[sSS_ServerName]['SslCertificate'] := cAppSSL_Certificate
If(!Empty(cAppSSL_key))
jo[sSS_ServerName]['SslCertificateKey'] := cAppSSL_key
EndIf
If(!Empty(cAppSSL_passphrase))
jo[sSS_ServerName]['SslCertificatePass'] := cAppSSL_passphrase
EndIf
If(!Empty(cAppSSL_method))
jo[sSS_ServerName]['SslMethod'] := cAppSSL_method
EndIf
cURLTest := "https://"
Else
1 - Primeiros Passos – 29
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
cURLTest := "http://"
EndIf
If(!Empty(sSS_ContentTypes))
jo[sSS_ServerName]['ContentTypes'] := sSS_ContentTypes
EndIf
jo[sSS_Location] := JsonObject():new()
jo[sSS_Location]['Path'] := cAppPath
jo[sSS_Location]['RootPath'] := cAppRootPath
jo[sSS_Location]['DefaultPage'] := {"index.html"}
jo[sSS_Location]['ThreadPool'] := sSS_ThreadPool
jo[sSS_ThreadPool] := JsonObject():new()
jo[sSS_ThreadPool]['Environment'] := cEnv
jo[sSS_ThreadPool]['MinThreads'] := 1
jo[sSS_ThreadPool]['MaxThreads'] := 5
jo[sSS_ThreadPool]['GrowthFactor'] := 1
jo[sSS_ThreadPool]['MinFreeThreads'] := 1
jo[sSS_ThreadPool]['InactiveTimeout'] := 180000 // 180 segundos
jo[sSS_ThreadPool]['AcceptTimeout'] := 5000 // 5 segundos
If(!Empty(sSS_UserExits))
jo[sSS_ThreadPool]['UserExits'] := sSS_UserExits
jo[sSS_UserExits] := JsonObject():new()
If(!Empty(cOnStartFunc))
jo[sSS_UserExits]['OnStart'] := cOnStartFunc
EndIf
If(!Empty(cOnStopFunc))
jo[sSS_UserExits]['OnStop'] := cOnStopFunc
EndIf
If(!Empty(cOnSelectFunc))
jo[sSS_UserExits]['OnSelect'] := cOnSelectFunc
EndIf
If(!Empty(cOnErrorFunc))
jo[sSS_UserExits]['OnError'] := cOnErrorFunc
EndIf
EndIf
If(!Empty(sSS_Slave01))
jo[sSS_ThreadPool]['Slaves'] := {sSS_Slave01}
jo[sSS_Slave01] := JsonObject():new()
jo[sSS_Slave01]['Environment'] := cEnv
jo[sSS_Slave01]['MinThreads'] := 1
jo[sSS_Slave01]['MaxThreads'] := 5
jo[sSS_Slave01]['MinFreeThreads'] := 1
jo[sSS_Slave01]['GrowthFactor'] := 1
If(!Empty(sSS_UserExitsSlave))
1 - Primeiros Passos – 30
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
jo[sSS_Slave01]['UserExits'] := sSS_UserExitsSlave
jo[sSS_UserExitsSlave] := JsonObject():new()
If(!Empty(cOnStartFuncSlave))
jo[sSS_UserExitsSlave]['OnStart'] := cOnStartFuncSlave
EndIf
If(!Empty(cOnStopFuncSlave))
jo[sSS_UserExitsSlave]['OnStop'] := cOnStopFuncSlave
EndIf
If(!Empty(cOnSelectFuncSlave))
jo[sSS_UserExitsSlave]['OnSelect'] := cOnSelectFuncSlave
EndIf
If(!Empty(cOnErrorFuncSlave))
jo[sSS_UserExitsSlave]['OnError'] := cOnErrorFuncSlave
EndIf
EndIf
EndIf
If(!Empty(sSS_ContentTypes))
jo[sSS_ContentTypes] := JsonObject():new()
jo[sSS_ContentTypes]['htm'] := "text/html"
jo[sSS_ContentTypes]['html'] := "text/html"
jo[sSS_ContentTypes]['json'] := "application/json"
jo[sSS_ContentTypes]['js'] := "application/javascript"
jo[sSS_ContentTypes]['txt'] := "text/plain"
jo[sSS_ContentTypes]['*'] := "application/octet-stream"
EndIf
If (!Empty(sSS_CORS))
jo[sSS_Location]['CORS'] := {sSS_CORS}
jo[sSS_CORS] := JsonObject():new()
jo[sSS_CORS]['AllowOrigins'] := {"http://127.0.0.1:8080","http://
localhost:8080"}
jo[sSS_CORS]['AllowMethods'] := {"POST", "GET", "PUT", "DELETE", "PATCH"}
EndIf
jEndpoints[cGetPath] := JsonObject():new()
jEndpoints[cGetPath]['GET'] := JsonObject():new()
jEndpoints[cGetPath]['GET']['ClassName'] := ""
jEndpoints[cGetPath]['GET']['Function'] :=
"rest.u_getWithoutAnnotation"
jEndpoints[cGetPath]['GET']['EndPoint'] := {cGetWithoutAnnot, "get"}
EndIf
1 - Primeiros Passos – 31
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
cURLTest += "localhost:"
cURLTest += cValToChar(jo[sSS_ServerName]['Port'])
cURLTest += jo[sSS_Location]['Path']
cURLTest2 := cURLTest
cURLTest3 := cURLTest
cURLTest += "/tlpp/environment"
cURLTest2 += "/test"
cURLTest3 += cGetPath
Return .T.
Else
// Falhou
ConOut("Fail to start rest server [" + cValToChar(nResult) + "] - " +
cValToChar(oVdrCtrl:nErr) + " - " + cValToChar(oVdrCtrl:cErr))
Return .F.
EndIf
Return .F.
@Get("/test")
Function u_getWithAnnotation()
oRest:setResponse(time() + " " + "Hello TL++ World")
Return .T.
Function u_getWithoutAnnotation()
oRest:setResponse(time() + " " + "Hello TL++ World - Without Annotation")
Return .T.
Function u_main_on_start()
ConOut(cValToChar(ThreadId()) + " MAIN: " + ProcName())
Return .T.
Function u_main_on_select()
ConOut(cValToChar(ThreadId()) + " MAIN: " + ProcName())
Return -1
Function u_slave_on_start()
ConOut(cValToChar(ThreadId()) + " SLAVE: " + ProcName())
Return .T.
1 - Primeiros Passos – 32
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Function u_slave_on_select()
ConOut(cValToChar(ThreadId()) + " SLAVE: " + ProcName())
Return 0
> Para saber mais sobre **LoadURNs**, acesse a documentação [REST sem uso de annotation](https://
tdn.totvs.com/pages/viewpage.action?pageId=553343250(see page 53)).
• Usando o SmartClient:
Abrir o SmartClient e digitar na tela:
• Programa inicial: tlpp.environment.getIncludesTLPP
• Comunicação no cliente: [seu serviço]
3 https://tdninterno.totvs.com/display/tec/Downloads
4 https://tdn.totvs.com/pages/viewpage.action?spaceKey=tec&title=RootPath
5 https://www.youtube.com/watch?v=MwIu01Ztfvg&t=172s
1 - Primeiros Passos – 33
TOTVSTEC – REST
If(lRet != .T.)
ConOut("Error: " + cValToChar(cRet))
For nI := 1 to Len(aMessages)
ConOut(cValToChar(nI) + " Error: " + cValToChar(aMessages[nI]))
Next
Else
ConOut("OK. 'includes' extracted on path: " + cValToChar(cRet))
EndIf
Return lRet
Obs. Você pode criar fontes .tlpp e/ou .prw sem nenhum include se eles não tiverem nenhuma dependência
6 //tdn.totvs.com/rest_server.md
1 - Primeiros Passos – 34
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
@Get("/test/helloWorld")
Function u_helloWorld()
Local cReturn := "Meu primeiro REST em TL++ " as character
oRest:setResponse(cReturn)
Return .T.
class helloWorld
public data cReturn as character
@Get("/test/helloWorld")
public method sayHello() as logical
endClass
Includes
#include 'tlpp-core.th'
#include 'tlpp-rest.th'
As includes tlpp-core.th e tlpp-rest.th são as únicas bibliotecas necessárias para o funcionamento básico
que qualquer função\classe REST.
As mesmas já se encontram inclusas no tlpp.rpo bastando apenas declará-las.
@Get
@Get("/test/helloWorld")
A utilização de annotations tornou possível a simplificação na escrita de funções\classes REST. Com elas a
aplicação faz o vínculo entre: verbo(delete,get,path,post,put) , a URN e a função/método responsável.
1 - Primeiros Passos – 35
TOTVSTEC – REST
oRest:setResponse("mensagem retorno")
oRest:setResponse(::cReturn)
Este método é o responsável por enviar a mensagem de retorno no corpo da requisição para o client(requisitante).
Neste exemplo está sendo retornado uma mensagem simples, mas é possivel efetuar o retorno de todos os
formatos nas permitidos para respostas de requisições HTTP em API´s do tipo REST.
Saiba mais sobre o método setResponse()8
http://127.0.0.1:8080/totvs/api/sample?param1=value
e
https://127.0.0.1:444/totvs/api/sample?param1=value
• Path Virtual
/totvs
• Endpoint
/api/sample
7 //tdn.totvs.com/annotationsRest.md#@Get
8 //tdn.totvs.com/classRest.md#setResponse
1 - Primeiros Passos – 36
TOTVSTEC – REST
?param1=value
Agora, olhando parte a parte, conseguimos entender melhor de onde vem cada informação, vamos a elas:
HTTP
[HTTPSERVER]
Enable=1
Servers=HTTP_SERVER
[HTTP_SERVER]
port=8080
Note que as chaves SslCertificate e SslCertificateKey são inexistentes na configuração do server, sendo assim o REST
já assume o protocolo HTTP.
HTTPS
[HTTPSERVER]
Enable=1
Servers=HTTP_SSL_SERVER
[HTTP_SSL_SERVER]
port=444
SslCertificate=SSL_certificate.crt
1 - Primeiros Passos – 37
TOTVSTEC – REST
SslCertificateKey=SSL_certificate_key.pem
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Note que nesse caso, as chaves SslCertificate e SslCertificateKey são informadas na configuração do server, sendo
assim o REST já assume o protocolo HTTPS.
Importante saber que se não informar o caminho path completo, os arquivos precisam estar na pasta BIN onde é
executado o appserver
[HTTPSERVER]
Enable=1
Servers=HTTP_SERVER
[HTTP_SERVER]
port=8080
[HTTPSERVER]
Enable=1
Servers=HTTP_SSL_SERVER
[HTTP_SSL_SERVER]
locations=HTTP_ROOT
[HTTP_ROOT]
Path=/totvs
Para saber mais sobre definição de Locations, acesse aqui(see page 62).
1 - Primeiros Passos – 38
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
2.4.3.1
Annotation
@Get( endpoint="/api/sample" )
user function apiSample()
......
oRest:setResponse(cJson)
return
Para saber mais sobre como criar serviços via Annotation, veja a documentação completa aqui(see page 40).
2.4.3.2 JSON
user function sLoadURNs()
jEndpoints := jsonObject():New()
jEndpoints[cGetPath] := JsonObject():new()
jEndpoints[cGetPath]['GET'] := JsonObject():new()
jEndpoints[cGetPath]['GET']['ClassName'] := ""
jEndpoints[cGetPath]['GET']['Function'] := "U_apiSample"
jEndpoints[cGetPath]['GET']['EndPoint'] := {"api","sample"}
return jEndpoints
Para saber mais sobre como criar serviços via JSON, veja a documentação completa aqui(see page 53).
1 - Primeiros Passos – 39
TOTVSTEC – REST
3 2 - Configurações Avançadas
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
• POST
O método POST é utilizado para adicionar recursos no servidor REST. Se for um serviço que seja o cadastro
de clientes, o método POST irá criar um registro novo referente a um cliente novo.
2 - Configurações Avançadas – 40
TOTVSTEC – REST
• PUT
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
O método PUT modifica um recurso existente no servidor. Na semântica usada em modo geral, pelo método
PUT enviamos todos os dados do recurso, independentemente se serão modificados somente partes dos
dados.
• PATCH
O método PATCH modifica um recurso existente no servidor. Na semântica usada em modo geral, pelo
método PATCH enviamos somente os dados que serão modificados.
• DELETE
O método DELETE é usado para apagar um recurso no servidor REST.
Nota: Embora os métodos PUT e PATCH sejam usados semanticamente de forma diferentes, tecnicamente não há
exigência para que as aplicações serem implementadas desse modo.
Existem implementações que utilizam Criar e Modificar recursos através de um único método, ou seja, POST, PUT e
PATCH são usados através, por exemplo, do método POST e o tratamento é feito na lógica implementada no
servidor.
Embora não esteja de acordo com a semântica proposta, não significa que esteja errado.
A annotation utiliza duas propriedades, embora somente 1 é essencial para o funcionamento do serviço, sendo:
• endpoint Essa propriedade é obrigatória e é responsável para definir o endpoint utilizado na URL para que
o usuário possa fazer uma requisição ao serviço.
• description É somente a descrição, não é obrigatória e tem a finalidade somente para escrever para que
ser o serviço.
Abaixo iremos exemplificar um método GET, informando todas as propriedades, e somente a endpoint em suas
duas formas.
#include "tlpp-core.th"
#include "tlpp-rest.th"
/*
Exemplo 01
......
oRest:setResponse(cJson)
return
/*
Exemplo 02
2 - Configurações Avançadas – 41
TOTVSTEC – REST
*/
@Get( endpoint="sample/onlyEndpoint1" )
user function sampleOnlyEndpoint1()
......
oRest:setResponse(cJson)
return
/*
Exemplo 03
......
oRest:setResponse(cJson)
return
3.1.1 @DELETE()
Esta annotation deve ser utilizada quando for necessário desenvolver uma aplicação que responderá pelo método/
verbo DELETE. Este método/verbo deleta o recurso especificado. Abaixo veremos exemplos de sua utilização:
/* --------------------------------------------- */
@Delete("examples/function/delete/path/user/:user")
User Function examplesFunctionDeletePath()
Local cJson := ""
2 - Configurações Avançadas – 42
TOTVSTEC – REST
Local jPath
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
jPath := JsonObject():New()
jPath := oRest:getPathParamsRequest()
/* --------------------------------------------- */
@Delete("examples/function/delete/query/user")
User Function examplesFunctionDeleteQuery()
Local cJson := ""
Local jQuery
jQuery := JsonObject():New()
jQuery := oRest:getQueryRequest()
3.1.1.3 Exemplo utilizando classe com métodos e recebendo parâmetro via path param e query
string.
#include "tlpp-core.th"
#include "tlpp-rest.th"
Class classDeleteExamples
EndClass
Return self
2 - Configurações Avançadas – 43
TOTVSTEC – REST
/* --------------------------------------------- */
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
@Delete("examples/class/delete/path/user/:user")
Method methodExamplesDeletePath() class classDeleteExamples
jPath := JsonObject():New()
jPath := oRest:getPathParamsRequest()
/* --------------------------------------------- */
@Delete("examples/class/delete/query/user")
Method methodExamplesDeleteQuery() class classDeleteExamples
Local cJson := ""
Local jQuery
jQuery := JsonObject():New()
jQuery := oRest:getQueryRequest()
3.1.2 @GET()
Esta annotation deve ser utilizada quando for necessário desenvolver uma aplicação que responderá pelo método/
verbo GET. Este método/verbo solicita uma representação do recurso especificado na Uri. Abaixo veremos
exemplos de sua utilização:
/* --------------------------------------- */
@Get("examples/function/get/path/user/:user")
User Function examplesFunctionGetPath()
Local cJson := ""
Local jPath
jPath := JsonObject():New()
jPath := oRest:getPathParamsRequest()
2 - Configurações Avançadas – 44
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
/* --------------------------------------- */
@Get("examples/function/get/query/user")
User Function examplesFunctionGetQuery()
Local cJson := ""
Local jQuery
jQuery := JsonObject():New()
jQuery := oRest:getQueryRequest()
3.1.2.3 Exemplo utilizando classe com métodos recebendo parâmetro via path param e query
string.
#include "tlpp-core.th"
#include "tlpp-rest.th"
Class classGetExamples
EndClass
Return self
/* --------------------------------------- */
@Get("examples/class/get/path/user/:user")
Method methodExamplesGetPath() class classGetExamples
2 - Configurações Avançadas – 45
TOTVSTEC – REST
Local jPath
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
jPath := JsonObject():New()
jPath := oRest:getPathParamsRequest()
/* --------------------------------------- */
@Get("examples/class/get/query/user")
Method methodExamplesGetQuery() class classGetExamples
Local cJson := ""
Local jQuery
jQuery := JsonObject():New()
jQuery := oRest:getQueryRequest()
3.1.3 @PATCH()
Esta annotation deve ser utilizada quando for necessário desenvolver uma aplicação que responderá pelo método/
verbo PATCH. Este método/verbo aplica modificações parciais a um recurso. Abaixo veremos exemplos de sua
utilização:
/* ------------------------------------------- */
@Patch("examples/function/patch/path/user/:user")
User Function examplesFunctionPatchPath()
Local cJson := ""
Local jPath
Local cBody := ""
jPath := JsonObject():New()
jPath := oRest:getPathParamsRequest()
cBody := oRest:getBodyRequest()
2 - Configurações Avançadas – 46
TOTVSTEC – REST
+ '"} ]'
Endif
Return oRest:setResponse(cJson)
/* ------------------------------------------- */
@Patch("examples/function/patch/query/user")
User Function examplesFunctionPatchQuery()
Local cJson := ""
Local cBody := ""
Local jQuery
jQuery := JsonObject():New()
jQuery := oRest:getQueryRequest()
cBody := oRest:getBodyRequest()
3.1.3.3 Exemplo utilizando classe com métodos recebendo parâmetro via path param e query
string.
#include "tlpp-core.th"
#include "tlpp-rest.th"
Class classPatchExamples
EndClass
Return self
/* ------------------------------------------- */
@Patch("examples/class/patch/path/user/:user")
2 - Configurações Avançadas – 47
TOTVSTEC – REST
jPath := JsonObject():New()
jPath := oRest:getPathParamsRequest()
cBody := oRest:getBodyRequest()
/* ------------------------------------------- */
@Patch("examples/class/patch/query/user")
Method methodExamplesPatchQuery() class classPatchExamples
Local cJson := ""
Local cBody := ""
Local jQuery
jQuery := JsonObject():New()
jQuery := oRest:getQueryRequest()
cBody := oRest:getBodyRequest()
3.1.4 @POST()
Esta annotation deve ser utilizada quando for necessário desenvolver uma aplicação que responderá pelo método/
verbo POST. Este método/verbo é utilizado para submeter uma entidade a um recurso específico frequentemente
causando uma mudança no estado do recurso.
Abaixo veremos exemplos de sua utilização:
/* ----------------------------------------- */
@Post("examples/function/post/path/user/:user")
User Function examplesFunctionPostPath()
2 - Configurações Avançadas – 48
TOTVSTEC – REST
Local jPath
Local cBody := ""
jPath := JsonObject():New()
jPath := oRest:getPathParamsRequest()
cBody := oRest:getBodyRequest()
/* ----------------------------------------- */
@Post("examples/function/post/query/user")
User Function examplesFunctionPostQuery()
Local cJson := ""
Local cBody := ""
Local jQuery
jQuery := JsonObject():New()
jQuery := oRest:getQueryRequest()
cBody := oRest:getBodyRequest()
3.1.4.3 Exemplo utilizando classe com métodos recebendo parâmetro via path param e query
string.
#include "tlpp-core.th"
#include "tlpp-rest.th"
Class classPostExamples
2 - Configurações Avançadas – 49
TOTVSTEC – REST
EndClass
Return self
/* ----------------------------------------- */
@Post("examples/class/post/path/user/:user")
Method methodExamplesPostPath() class classPostExamples
jPath := JsonObject():New()
jPath := oRest:getPathParamsRequest()
cBody := oRest:getBodyRequest()
/* ----------------------------------------- */
@Post("examples/class/post/query/user")
Method methodExamplesPostQuery() class classPostExamples
Local cJson := ""
Local cBody := ""
Local jQuery
jQuery := JsonObject():New()
jQuery := oRest:getQueryRequest()
cBody := oRest:getBodyRequest()
3.1.5 @PUT()
Esta annotation deve ser utilizada quando for necessário desenvolver uma aplicação que responderá pelo método/
verbo PUT. Este método/verbo substitui todas as atuais representações do recurso de destino pela carga de dados
da requisição.
Abaixo veremos exemplos de sua utilização:
2 - Configurações Avançadas – 50
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
/* --------------------------------------- */
@Put("examples/function/put/path/user/:user")
User Function examplesFunctionPutPath()
Local cJson := ""
Local jPath
Local cBody := ""
jPath := JsonObject():New()
jPath := oRest:getPathParamsRequest()
cBody := oRest:getBodyRequest()
/* --------------------------------------- */
@Put("examples/function/put/query/user")
User Function examplesFunctionPutQuery()
Local cJson := ""
Local cBody := ""
Local jQuery
jQuery := JsonObject():New()
jQuery := oRest:getQueryRequest()
cBody := oRest:getBodyRequest()
2 - Configurações Avançadas – 51
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
3.1.5.3 Exemplo utilizando classe com métodos recebendo parâmetro via path param e query
string.
#include "tlpp-core.th"
#include "tlpp-rest.th"
Class classPutExamples
EndClass
Return self
/* --------------------------------------- */
@Put("examples/class/put/path/user/:user")
Method methodExamplesPutPath() class classPutExamples
jPath := JsonObject():New()
jPath := oRest:getPathParamsRequest()
cBody := oRest:getBodyRequest()
/* --------------------------------------- */
@Put("examples/class/put/query/user")
Method methodExamplesPutQuery() class classPutExamples
Local cJson := ""
Local cBody := ""
Local jQuery
jQuery := JsonObject():New()
jQuery := oRest:getQueryRequest()
cBody := oRest:getBodyRequest()
2 - Configurações Avançadas – 52
TOTVSTEC – REST
Endif
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Return oRest:setResponse(cJson)
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']['MinThreads'] := 1
jConfig['INIT_THREAD_POOL_01']['MaxThreads'] := 4
jConfig['INIT_THREAD_POOL_01']['MinFreeThreads'] := 1
jConfig['INIT_THREAD_POOL_01']['GrowthFactor'] := 1
jConfig['INIT_THREAD_POOL_01']['InactiveTimeout'] := 30000
jConfig['INIT_THREAD_POOL_01']['AcceptTimeout'] := 10000
jConfig['INIT_ContentTypes'] := JsonObject():new()
2 - Configurações Avançadas – 53
TOTVSTEC – REST
jConfig['INIT_ContentTypes']['htm'] := "text/html"
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
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'] := "text/
plain;charset=ISO-8859-1"
jConfig['INIT_ContentTypes']['*'] := "application/octet-
stream"
/* -----------------------------------------------------------
Aqui é feita a chamada para a função responsável por criar o
vinculo entre URN´s e as aplicações
----------------------------------------------------------- */
jConfig['INIT_HTTP_REST']['LoadURNs'] := JsonObject():new()
if !( sLoadURNs(@jConfig['INIT_HTTP_REST']['LoadURNs']) )
return Nil
endif
/*------------------------------------------------------------*/
nResult := oVdrCtrl:Start(jConfig)
if ( ValType(nResult) == 'N' .AND. nResult == 0 )
conout("### Servidor HTTP inicializado com sucesso!")
else
conout("### Erro ao iniciar HTTP Server - retorno [" + cValToChar(nResult) +
"] - " + cValToChar(oVdrCtrl:getControlErrCode()) + " - " + oVdrCtrl:getControl
ErrDesc() )
endif
return nResult
OBS.: Caso já exista algum serviço REST sendo criado por meio de função utilizando-se um JSon, basta incluir a
chamada da static sLoadUrn como será visto no item posterior.
2 - Configurações Avançadas – 54
TOTVSTEC – REST
jEndpoints[cGetPath] := JsonObject():new()
jEndpoints[cGetPath]['GET'] := JsonObject():new()
jEndpoints[cGetPath]['GET']['ClassName'] := ""
jEndpoints[cGetPath]['GET']['Function'] := "U_getExampleNoAnnotation"
jEndpoints[cGetPath]['GET']['EndPoint'] :={"documentation",
"noannotation", "get"}
jEndpoints[cDelPath]['DELETE'] := JsonObject():new()
jEndpoints[cDelPath]['DELETE']['ClassName'] := ""
jEndpoints[cDelPath]['DELETE']['Function'] := "U_deleteExampleNoAnnotation"
jEndpoints[cDelPath]['DELETE']['EndPoint'] :={"documentation",
"noannotation", "delete"}
jEndpoints[cPatchPath]['PATCH'] := JsonObject():new()
jEndpoints[cPatchPath]['PATCH']['ClassName'] := ""
jEndpoints[cPatchPath]['PATCH']['Function'] := "U_patchExampleNoAnnotation"
jEndpoints[cPatchPath]['PATCH']['EndPoint'] :={"documentation",
"noannotation", "patch"}
jEndpoints[cPostPath]['POST'] := JsonObject():new()
jEndpoints[cPostPath]['POST']['ClassName'] := ""
jEndpoints[cPostPath]['POST']['Function'] := "U_postExampleNoAnnotation"
jEndpoints[cPostPath]['POST']['EndPoint'] :={"documentation",
"noannotation", "post"}
jEndpoints[cPutPath]['PUT'] := JsonObject():new()
jEndpoints[cPutPath]['PUT']['ClassName'] := ""
jEndpoints[cPutPath]['PUT']['Function'] := "U_putExampleNoAnnotation"
jEndpoints[cPutPath]['PUT']['EndPoint'] :={"documentation",
"noannotation", "put"}
Return .T.
3.2.2.1 OBSERVAÇÃO
As funções, os endpoints e as demais configurações utilizadas nos exemplos vistos aqui, devem ser criados
conforme as regras e as necessidades de utilização de cada ambiente e desenvolvedor.
2 - Configurações Avançadas – 55
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Para saber detalhes de cada Sessão / Chave, basta clicar em cima de cada item no exemplo para acessar a
documentação especializada.
...
9 https://tdn.totvs.com/pages/viewpage.action?pageId=505767296
2 - Configurações Avançadas – 56
TOTVSTEC – REST
MaxThreads=4
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
MinFreeThreads=1
GrowthFactor=1
InactiveTimeout=30000
AcceptTimeout=10000
Slaves=SLAVE_01,SLAVE_02
...
3.3.1 Charset
>>
2 - Configurações Avançadas – 57
TOTVSTEC – REST
Charset é a chave para definir com qual Codepage o REST irá trabalhar.
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Não é obrigatório informar, porém o REST trabalha com UTF-8 como padrão.
Para mudar conforme necessidade, somente passe o valor desejado na chave Charset da sessão do server criado.
Ex:
Charset=UTF-8
Charset=CP1252
Configuração
Veja aqui(see page 56) para saber mais sobre como configurar o REST
Importante saber que se o ambiente principal (Environment) estiver com um Codepage diferente do definido no
REST, o application Server converterá automaticamente o buffer de retorno, caso seja um texto, para o Codepage
de saída.
Ex:
Se o Environment estiver configurado com seu Codepage padrão, ou seja CP1252, e o REST também estiver com
seu Codepage padrão(UTF-8), ao final do atendimento da requisição e antes de entregar a mensagem ao cliente,
acontecerá a conversão de CP1252 para UTF-8.
Caso o buffer de origem contenha algum caractere que invalide a conversão entre os Codepages, o
applicationServer informará no console.log
o erro de conversão, conforme exemplo:
[WARN ][SERVER] error in conversion routine. to: utf-8 from: cp1252.
Além disso, o retorno será com o buffer original e não ocorrerá a conversão.
Portanto, no header da mensagem HTTP terá a informação:
Content-Type: charset=cp1252
Ao invés de:
Content-Type: charset=utf-8
2 - Configurações Avançadas – 58
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Arquivo appserver.ini
[ContentTypes]
htm = text/html
html = text/html
css = text/css
js = text/javascript
json = application/json
txt = text/plain
* = application/octet-stream
JSON
jConfig['INIT_ContentTypes'] := JsonObject():new()
jConfig['INIT_ContentTypes']['htm'] := "text/html"
jConfig['INIT_ContentTypes']['html'] := "text/html"
jConfig['INIT_ContentTypes']['css'] := "text/css"
jConfig['INIT_ContentTypes']['js'] := "text/javascript"
jConfig['INIT_ContentTypes']['json'] := "application/json"
jConfig['INIT_ContentTypes']['txt'] := "text/plain"
jConfig['INIT_ContentTypes']['*'] := "application/octet-stream"
Não há limites para se criar chaves em ContentTypes, o exemplo acima retratou apenas alguns tipos para que a
documentação não fique extensa.
Enable integer/boolean X
Log integer/boolean
Charset string
Servers string/array X
Enable
Define se o HttpServer será ativado ao iniciar o Appserver.
2 - Configurações Avançadas – 59
TOTVSTEC – REST
Caso seja utilizado o arquivo appserver.ini o formato do valor desta chave deve ser integer / numérico:
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
• 0 = disable
• 1 = enable
Caso seja utilizado o JSON seu valor deve ser do tipo boolean / lógico:
• .F. para disable
• .T. para enable
Log
Define se habilita ou não a gravação dos logs de eventos do HttpServer.
Caso seja utilizado o arquivo appserver.ini o formato do valor desta chave deve ser integer / numérico:
• 0 = disable
• 1 = enable
Caso seja utilizado o JSON seu valor deve ser do tipo boolean / lógico:
• .F. para disable
• .T. para enable
Charset
Documentos de texto transmitidos por HTTP tais como: text/html, text/plain, etc, podem enviar um parâmetro
charset no cabeçalho da requisição para especificar a codificação de caracteres a serem utilizadas no documento. É
muito importante sempre rotular explicitamente documentos Web.
O padrão HTTP 1.1 diz que o charset padrão é o ISO-8859-1. Porém, existem muitos documentos não rotulados em
outras codificações, por isso, quando não se define um charset os navegadores (browsers) podem utilizar uma
codificação de acordo com as suas próprias preferências.
Servers
Lista não vazia com os nomes dos servidores que serão ativados no start do server. Os nomes definidos nesta chave
devem ser utilizados na próxima sessão SERVERS.
Caso seja utilizado o arquivo appserver.ini,o formato do valor desta chave deve ser string com os valores
separados por vírgula. Caso seja utilizado o JSON, seu valor deve ser do tipo array.
Arquivo appserver.ini
[HTTPSERVER]
Enable=1
Log=1
Charset=ISO-8859-1
Servers=INIT_HTTP_REST,INIT_HTTPS_REST
2 - Configurações Avançadas – 60
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
JSON
jConfig['HTTPSERVER'] := JsonObject():New()
jConfig['HTTPSERVER']['Enable'] := .T.
jConfig['HTTPSERVER']['Log'] := .F.
jConfig['HTTPSERVER']['Charset'] := "ISO-8859-1"
jConfig['HTTPSERVER']['Servers'] := {"INIT_HTTP_REST","INIT_HTTPS_REST"}
Caso seja utilizado o arquivo appserver.ini o formato do valor desta chave deve ser string com os nomes de
Locations separados por vírgula.
Caso seja utilizado o JSON, seu valor deve ser do tipo array.
Arquivo appserver.ini
[INIT_HTTP_REST]
locations=HTTP_ROOT_01
JSON
jConfig['INIT_HTTP_REST'] := JsonObject():New()
jConfig['INIT_HTTP_REST']['locations'] := {"HTTP_ROOT_01"}
Arquivo appserver.ini
[INIT_HTTP_REST]
locations=HTTP_ROOT_01,HTTP_ROOT_02
JSON
jConfig['INIT_HTTP_REST'] := JsonObject():New()
jConfig['INIT_HTTP_REST']['locations'] := {"HTTP_ROOT_01","HTTP_ROOT_02"}
Para saber mais como funcionam os Paths virtuais, acessa a documentação sobre LOCATIONS (Sessão)(see page 62)
2 - Configurações Avançadas – 61
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Path string X
RootPath string X
DefaultPage string
ThreadPool string X
Path
Path virtual da URL que identificará do serviço.
RootPath
Path físico onde estarão os arquivos manipulados pelo serviço.
DefaultPage
Informa qual será a página estática default do serviço.
Caso seja utilizado o arquivo appserver.ini o formato do valor desta chave deve ser string.
Caso seja utilizado o JSON, seu valor deve ser do tipo array.
Pode ser passada uma lista páginas default, com os nomes separados por vírgula.
ThreadPool
Define qual o thread pool irá executar as requisições desta location. O nome definido nesta chave deverá ser
utilizado na sessão THREADPOOL.
2 - Configurações Avançadas – 62
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Arquivo appserver.ini
[HTTP_ROOT_01]
Path=/rest
RootPath=C:\tlppCore\bin\root\web
DefaultPage=index.html
ThreadPool=INIT_THREAD_POOL_01
[HTTPS_ROOT_01]
Path=/rest
RootPath=C:\tlppCore\bin\root\web
DefaultPage=index.html,totvs.html
ThreadPool=INIT_THREAD_POOL_02
JSON
jConfig['HTTP_ROOT_01'] := JsonObject():new()
jConfig['HTTP_ROOT_01']['Path'] := "/rest"
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['HTTPS_ROOT_01'] := JsonObject():new()
jConfig['HTTPS_ROOT_01']['Path'] := "/rest"
jConfig['HTTPS_ROOT_01']['RootPath'] := "C:\tlppCore\bin\root\web"
jConfig['HTTPS_ROOT_01']['DefaultPage'] := {"index.html", "totvs.html"}
jConfig['HTTPS_ROOT_01']['ThreadPool'] := "INIT_THREAD_POOL_02"
Caso seja utilizado o arquivo appserver.ini o formato do valor desta chave deve ser string com os nomes de servers
separados por vírgula.
Caso seja utilizado o JSON, seu valor deve ser do tipo array.
Arquivo appserver.ini
[HTTPSERVER]
Servers=INIT_HTTP_REST
2 - Configurações Avançadas – 63
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
JSON
jConfig['HTTPSERVER'] := JsonObject():New()
jConfig['HTTPSERVER']['Servers'] := {"INIT_HTTP_REST"}
Arquivo appserver.ini
[HTTPSERVER]
Enable=1
Log=1
Charset=ISO-8859-1
Servers=INIT_HTTP_REST,INIT_HTTPS_REST
JSON
jConfig['HTTPSERVER'] := JsonObject():New()
jConfig['HTTPSERVER']['Enable'] := .T.
jConfig['HTTPSERVER']['Log'] := .F.
jConfig['HTTPSERVER']['Charset'] := "ISO-8859-1"
jConfig['HTTPSERVER']['Servers'] := {"INIT_HTTP_REST","INIT_HTTPS_REST"}
Para saber mais sobre configuração de servidores, acesse a documentação sobre SERVERS (Sessão)(see page 64)
Port integer X
Hostname string X
ContentTypes string
Locations string/array X
SslCertificate string
SslCertificateKey string
2 - Configurações Avançadas – 64
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
tlppData string/JSON
userData string/JSON
Port
Define a porta em que o servidor atenderá às requisições após ativado.
Hostname
Define o nome virtual para o servidor ativado.
ContentTypes
Define o nome da sessão que será responsável pela definição dos content-types suportados pelo serviço.
Locations
Define o nome das sessões(locations) deste servidor. O(s) nome(s) definido(s) nesta chave deverão utilizado(s) na
chave LOCATIONS.
Caso seja utilizado o arquivo appserver.ini o formato do valor desta chave deve ser string. Caso seja utilizado o
JSON, seu valor deve ser do tipo array.
SslCertificate
Informar o path com o nome do arquivo do certificado digital, para utilização do REST com o protocolo HTTPS/SSL.
SslCertificateKey
Informar o path com o nome do arquivo com a chave do certificado digital, para utilização do REST com o
protocolo HTTPS/SSL.
tlppData
Esta chave possibilita a configuração simultânea de múltiplos recursos.
2 - Configurações Avançadas – 65
TOTVSTEC – REST
O valor informado em tlppData deve ter conteúdo final um JSON válido, e dizemos valor final pois diretamente na
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
chave você irá colocar um conteúdo de tipo string, que pode ser já o JSON desejado ou o nome de arquivo(*) que
em seu conteúdo seja o JSON.
Caso seja informado o arquivo, pode-se fazer de duas maneiras:
• Nome arquivo (irá buscar o arquivo em rootPath)
• Caminho absoluto + Nome arquivo
Embora no exemplo de configuração dessa documentação essa chave tenha sido usada somente na sessão do
Servidor, ela pode ser usada na sessão de definição das Thread Pool e Slaves.
Atenção -> Esse JSON é de uso exclusivo de recursos nativos do REST, portanto para utilizá-lo é preciso seguir à
risca a documentação de cada funcionalidade.
userData
Esta chave possibilita a configuração simultânea de múltiplos recursos, porém diferente do tlppCore essa é de uso
exclusivo de cada usuário, portanto a utilize para customizar as configurações em seus recursos específicos.
O valor informado em userData deve ter conteúdo final um JSON válido, e dizemos valor final pois diretamente na
chave você irá colocar um conteúdo de tipo string, que pode ser já o JSON desejado ou o nome de arquivo(*) que
em seu conteúdo seja o JSON.
Caso seja informado o arquivo, pode-se fazer de duas maneiras:
• Nome arquivo (irá buscar o arquivo em rootPath)
• Caminho absoluto + Nome arquivo
Embora no exemplo de configuração dessa documentação essa chave tenha sido usada somente na sessão do
Servidor, ela pode ser usada na sessão de definição das Thread Pool e Slaves.
Arquivo appserver.ini
[INIT_HTTP_REST]
Port=9080
Hostname=TLPP_REST_SERVER
ContentTypes=ContentTypes
Locations=HTTP_ROOT_01
tlppdata=c:\config\tlppData.JSON
userdata=c:\config\userData.JSON
[INIT_HTTPS_REST]
Port=9081
Hostname=TLPP_SSL_REST_SERVER
ContentTypes=ContentTypes
Locations=HTTPS_ROOT_01
SslCertificate=totvs_certificate.crt
SslCertificateKey=totvs_certificate_key.pem
tlppdata=c:\config\tlppData.JSON
userdata=c:\config\userData.JSON
2 - Configurações Avançadas – 66
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
JSON
jConfig['INIT_HTTP_REST'] := JsonObject():New()
jConfig['INIT_HTTP_REST']['Port'] := "9080"
jConfig['INIT_HTTP_REST']['HostName'] := "TLPP_REST_SERVER"
jConfig['INIT_HTTP_REST']['ContentTypes'] := "ContentTypes"
jConfig['INIT_HTTP_REST']['Locations'] := {"HTTP_ROOT_01"}
jConfig['INIT_HTTP_REST']['tlppdata'] := "c:\config\tlppData.JSON"
jConfig['INIT_HTTP_REST']['userdata'] := "c:\config\userData.JSON"
jConfig['INIT_HTTPS_REST'] := JsonObject():New()
jConfig['INIT_HTTPS_REST']['Port'] := "9081"
jConfig['INIT_HTTPS_REST']['HostName'] := "TLPP_SSL_REST_SERVER"
jConfig['INIT_HTTPS_REST']['Charset'] := "iso-8859-1"
jConfig['INIT_HTTPS_REST']['ContentTypes'] := "ContentTypes"
jConfig['INIT_HTTPS_REST']['Locations'] := {"HTTPS_ROOT_01"}
jConfig['INIT_HTTPS_REST']['SslCertificate'] := "C:
\tlppCore\bin\totvs_certificate.crt"
jConfig['INIT_HTTPS_REST']['SslCertificateKey'] := "C:
\tlppCore\bin\totvs_certificate_key.pem"
jConfig['INIT_HTTPS_REST']['tlppdata'] := "c:\config\tlppData.JSON"
jConfig['INIT_HTTPS_REST']['userdata'] := "c:\config\userData.JSON"
Environment string X
MinThreads integer X
MaxThreads integer
MinFreeThreads integer
GrowthFactor integer
InactiveTimeout integer
AcceptTimeout integer
2 - Configurações Avançadas – 67
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Environment
Esta chave define o environment(ambiente) onde o REST será executado.
Esta chave só é obrigatória quando utilizada no arquivo appserver.ini, quando utilizado o JSON ela não deve ser
declarada pois como o appserver já se encontra inicializado, ele considera o environment em uso.
MinThreads
Indica a quantidade mínima de threads ativas no thread pool. O valor declarado deve ser maior que zero.
MaxThreads
Indica a quantidade máxima de threads ativas no thread pool. O seu valor deve ser maior ou igual ao declarado na
chave "MinThreads".
MinFreeThreads
Indica a quantidade minima de threads ativas no thread pool. Deve ser maior ou igual ao valor declarado na chave
"MinThreads".
GrowthFactor
O fator de crescimeto indica a quantidade de threads novas a serem alocadas sempre que o thread pool estiver com
todas as suas threads em uso. Seu valor deve ser maior que zero.
InactiveTimeout
Indica o tempo em milisegundos que a thread ficará ativa aguardando uma nova requisição. Se este tempo for
expirado a thread poderá ser finalizada conforme controle interno de threads.
O valor informado deve ser maior que zero, mas por ser uma chave opcional, quando não informada o sistema
assume o valor de 30 segundos por default.
AcceptTimeout
Indica o tempo em milisegundos que uma nova requisição deve ficar na fila de processamento aguardando sua vez
de ser atendida. Quando extrapolado este tempo, a requisição é descartada retornando ao client(chamador) o
código de status - 503 - "Server Busy".
2 - Configurações Avançadas – 68
TOTVSTEC – REST
O valor informado deve ser maior que zero, mas por ser uma chave opcional, quando não informada o sistema
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
UserExits
Indica o nome da sessão com a configuração das chaves UserExits. O(s) nome(s) definido(s) nesta chave deverão ser
utilizado(s) na sessão USEREXITS.
Exemplos de configuração
Arquivo appserver.ini
[SLAVE_THREAD_POOL_01_01]
Environment=HTTPREST
MinThreads=2
MaxThreads=4
MinFreeThreads=2
GrowthFactor=1
InactiveTimeout=30000
AcceptTimeout=10000
UserExits=UE_01
JSON
jConfig['SLAVE_THREAD_POOL_01_01'] := JsonObject():new()
jConfig['SLAVE_THREAD_POOL_01_01']['MinThreads'] := 1
jConfig['SLAVE_THREAD_POOL_01_01']['MaxThreads'] := 4
jConfig['SLAVE_THREAD_POOL_01_01']['MinFreeThreads'] := 1
jConfig['SLAVE_THREAD_POOL_01_01']['GrowthFactor'] := 1
jConfig['SLAVE_THREAD_POOL_01_01']['InactiveTimeout'] := 30000
jConfig['SLAVE_THREAD_POOL_01_01']['AcceptTimeout'] := 10000
jConfig['SLAVE_THREAD_POOL_01_01']['UserExists'] := UE_01
Environment string X
MinThreads integer X
MaxThreads integer X
2 - Configurações Avançadas – 69
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
MinFreeThreads integer X
GrowthFactor integer X
Slaves string/array
InactiveTimeout integer
AcceptTimeout integer
UserExists string
Environment
Esta chave define o environment(ambiente) onde o REST será executado.
Esta chave só é obrigatória quando utilizada no arquivo appserver.ini, quando utilizado o JSON ela não deve ser
declarada pois como o appserver já se encontra inicializado, ele considera o environment em uso.
MinThreads
Indica a quantidade mínima de threads ativas no thread pool. O valor declarado deve ser maior que zero.
MaxThreads
Indica a quantidade máxima de threads ativas no thread pool. O seu valor deve ser maior ou igual ao declarado na
chave "MinThreads".
MinFreeThreads
Indica a quantidade minima de threads ativas no thread pool. Deve ser maior ou igual ao valor declarado na chave
"MinThreads".
GrowthFactor
O fator de crescimeto indica a quantidade de threads novas a serem alocadas sempre que o thread pool estiver com
todas as suas threads em uso. Seu valor deve ser maior que zero.
2 - Configurações Avançadas – 70
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Slaves
Lista com o(s) thread pool(s) filho(s)/slave(s) deste thread pool. Pode(m) ser utilizado(s) para que sejam
direcionados os atendimentos das requisições.
Quando declarada, esta chave respeita o formato de string no appserver.ini e o formato de array quando utilizado
o JSON.
InactiveTimeout
Indica o tempo em milisegundos que a thread ficará ativa aguardando uma nova requisição. Se este tempo for
expirado a thread poderá ser finalizada conforme controle interno de threads.
O valor informado deve ser maior que zero, mas por ser uma chave opcional, quando não informada o sistema
assume o valor de 30 segundos por default.
AcceptTimeout
Indica o tempo em milisegundos que uma nova requisição deve ficar na fila de processamento aguardando sua vez
de ser atendida. Quando extrapolado este tempo, a requisição é descartada retornando ao client(chamador) o
código de status - 503 - "Server Busy".
O valor informado deve ser maior que zero, mas por ser uma chave opcional, quando não informada o sistema
assume o valor de 10 segundos por default.
UserExits
Indica o nome da sessão com a configuração das chaves UserExits. O(s) nome(s) definido(s) nesta chave deverão ser
utilizado(s) na sessão USEREXITS.
3.3.9.2 Observações
** Quando declarada, esta chave respeita o formato de string no appserver.ini e o formato de array quando
utilizado o JSON.
Exemplos de configuração
Arquivo appserver.ini
[INIT_THREAD_POOL_01]
Environment=HTTPREST
MinThreads=2
MaxThreads=4
MinFreeThreads=2
GrowthFactor=1
2 - Configurações Avançadas – 71
TOTVSTEC – REST
Slaves=SLAVE_THREAD_POOL_01_01,SLAVE_THREAD_POOL_01_02
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
InactiveTimeout=30000
AcceptTimeout=10000
UserExits=UE_01
[INIT_THREAD_POOL_02]
Environment=HTTPREST
MinThreads=1
MaxThreads=5
MinFreeThreads=1
GrowthFactor=1
Slaves=SLAVE_THREAD_POOL_02_01,SLAVE_THREAD_POOL_02_02
UserExits=UE_02
JSON
jConfig['INIT_THREAD_POOL_01'] := JsonObject():new()
jConfig['INIT_THREAD_POOL_01']['MinThreads'] := 1
jConfig['INIT_THREAD_POOL_01']['MaxThreads'] := 4
jConfig['INIT_THREAD_POOL_01']['MinFreeThreads'] := 1
jConfig['INIT_THREAD_POOL_01']['GrowthFactor'] := 1
jConfig['INIT_THREAD_POOL_01']['Slaves'] := {"SLAVE_THREAD_POOL_01_01","SLAVE_TH
READ_POOL_01_02"}
jConfig['INIT_THREAD_POOL_01']['InactiveTimeout'] := 30000
jConfig['INIT_THREAD_POOL_01']['AcceptTimeout'] := 10000
jConfig['INIT_THREAD_POOL_01']['UserExists'] := UE_01
jConfig['INIT_THREAD_POOL_02'] := JsonObject():new()
jConfig['INIT_THREAD_POOL_02']['MinThreads'] := 1
jConfig['INIT_THREAD_POOL_02']['MaxThreads'] := 4
jConfig['INIT_THREAD_POOL_02']['MinFreeThreads'] := 1
jConfig['INIT_THREAD_POOL_02']['GrowthFactor'] := 1
jConfig['INIT_THREAD_POOL_02']['Slaves'] := {"SLAVE_THREAD_POOL_02_01","SLAVE_TH
READ_POOL_02_02"}
jConfig['INIT_THREAD_POOL_02']['UserExists'] := UE_02
3.3.10.1 O que é?
A camada tlppCore do REST server possui uma infinidade de funcionalidades nativas que serão configuradas
através dessa chave.
Nota: As regras para uso dessa chave seguem o mesmo modo de UserData(see page 73), porém não pode-se criar
configurações aleatórias nessa chave, dever-se-á seguir a documentação de cada funcionalidade conforme suas
documentações.
3.3.10.2 Configuração
Observem o exemplo de configuração abaixo:
2 - Configurações Avançadas – 72
TOTVSTEC – REST
Nota: os trechos que estão ocultos foram substituídos por ... para facilitar a leitura. A configuração completa você
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
[HTTP_SRV]
locations=HTTP_ROOT
tlppData=''
...
[HTTP_ROOT]
ThreadPool=THREAD_POOL
...
[THREAD_POOL]
tlppData=''
...
Slaves=SLAVE_01,SLAVE_02
[SLAVE_01]
tlppData=''
...
[SLAVE_02]
tlppData=''
...
Notem que é possível configurar essa chave desde o nível do server, até o mais especialista dos slaves, porém,
como dito anteriormente, é preciso seguir a documentação à risca de cada documentação para o correto uso
dessas chaves.
Sendo assim, começamos agora a demonstrar como se utiliza a cada um dos Callback.
3.3.11.1 O que é?
Uma das preocupações do REST tlppCore é manter uma flexibilidade de uso onde o usuário/cliente possa ter
recursos suficientes para desenvolver seus serviços REST conforme suas necessidades.
Uma dessas flexibilidades é uma chave de configuração de uso exclusivo do desenvolvedor, onde pode informar a
quantidade de conjuntos de {chave:valor} que quiser através de um JSON.
2 - Configurações Avançadas – 73
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
userData={"exemplo":"direto na chave"}
Esse modo é o mais simples, pois a informação já estará diretamente na chave.
Porém, valores em chaves podem ter a limitação na quantidade de caracteres do conteúdo do valor dependendo
da versão do appserver utilizada (consulte documentação e versão do server).
Caso necessite utilizar JSON extensos, sugerimos utilizar os modos seguintes:
userData=userData.json
No exemplo acima, o arquivo deverá estar na mesma pasta do appserver.
Exemplo: (caminho absoluto + nome do arquivo)
userData=c:\configRest\userData.json
O uso de caminho absoluto facilita na manutenção de arquivos de configuração, pois podem estar localizados em
local central.
Notas
1 - A extensão do arquivo não é obrigatória ser .json, pode-se utilizar .txt.
2 - O conteúdo do arquivo deve ser um JSON válido.
2 - Configurações Avançadas – 74
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Devemos lembrar que, quando uma Thread Pool possuir Slaves, o atendimento à requisição de fato será feito pelo
Slave e não pela Thread Pool, embora a requisição passe inicialmente pela Thread Pool, porém somente será usada
para distribuição da requisição para um dos Slaves com base nas regras do [onSelect].
O atendimento será feito pela Thread Pool somente quando ele não possuir Slave configurado.
3.3.11.4 Configuração
Observem os exemplos de configuração, feitas no INI, abaixo :
[HTTPSERVER]
Enable=1
Servers=HTTP_SRV
[HTTP_SRV]
locations=HTTP_ROOT
userData={"config":"server"}
[HTTP_ROOT]
ThreadPool=THREAD_POOL
[THREAD_POOL]
userData={"config":"threadpool"}
Nesse caso, temos 2 (dois) userData configurados:
Um para o servidor todo, ou seja, de qualquer Thread teremos acesso a esse mesmo userData.
2 - Configurações Avançadas – 75
TOTVSTEC – REST
O outro para as Threads de atendimento, e todas pegarão o userData configurado na Thread Pool, no exemplo
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
[HTTPSERVER]
Enable=1
Servers=HTTP_SRV
[HTTP_SRV]
locations=HTTP_ROOT
userData={"config":"server"}
[HTTP_ROOT]
ThreadPool=THREAD_POOL
[THREAD_POOL]
Slaves=SLAVE_01,SLAVE_02
[SLAVE_01]
userData={"config":"slave01"}
[SLAVE_02]
userData={"config":"slave02"}
Nesse caso, temos 3 (três) userData configurados:
Um para o servidor todo, ou seja, de qualquer Thread teremos acesso a esse mesmo userData.
Os outros 2 (dois) para as Threads de atendimento, porém, cada uma de seu respectivo Slave, ou seja, se a
requisição for distribuída para qualquer thread do [SLAVE_01], o conteúdo
de userData será {"config":"slave01"}, caso seja distribuída para qualquer thread do [SLAVE_02], então o
conteúdo de userDataserá {"config":"slave02"}
oRest:getThreadPoolServerUserData()
Esse método retornará o JSON informado no userData da sessão Server, nos exemplos aqui utilizados, a sessão
seria [HTTP_SRV] e seu conteúdo:
{"config":"server"}
Esse método quando requerido, sempre retornará o valor configurado no server, independentemente de qual
Thread está a execução do serviço.
2 - Configurações Avançadas – 76
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
oRest:getThreadPoolUserData()
Esse método retornará o JSON informado no userData do Thread Pool, ou do Slave.
Conforme dito anteriormente, essa variação ocorre devido à configuração (se existirão slaves) e de qual thread está
atendendo a requisição.
Para ficar claro, vamos utilizar os exemplos acima.
1. Se o cenário for do "Exemplo 1 (sem Slave)", então o método irá retornar o valor informado na sessão
Thread Pool, de nome [THREAD_POOL] e seu conteúdo seria:
{"config":"threadpool"}
1. Se o cenário for do "Exemplo 2 (com 2 Slaves)", então o método irá retornar o valor informado na sessão
Slave da qual pertence a thread que de fato está atendendo a requisição, sendo assim, temos 2
possibilidades:
2 - a) Se a thread pertencer ao primeiro Slave, então a sessão será de nome [SLAVE_01] e seu conteúdo:
{"config":"slave01"}
2 - b) Se a thread pertencer ao segundo Slave, então a sessão será de nome [SLAVE_02] e seu conteúdo:
{"config":"slave02"}
Nota
O retorno da ambos os métodos será sempre em formato JSON.
Exemplo
No exemplo abaixo, estamos utilizando os dois métodos.
Sugerimos que utiliza o exemplo e modifique a configuração do seu server para que fixe bem o conhecimento sobre
o assunto.
@Get("sample/userData")
function sampleUserData()
2 - Configurações Avançadas – 77
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
jUserData := oRest:getThreadPoolServerUserData()
cTemp := jUserData["config"]
if ( valtype(cTemp) <> 'C' )
cTemp := ''
endif
cReturn += '{"serverUserData":"' + cTemp + '"'
jUserData := oRest:getThreadPoolUserData()
cTemp := jUserData["config"]
if ( valtype(cTemp) <> 'C' )
cTemp := ''
endif
cReturn += ',"threadpoolUserData":"' + cTemp + '"}'
oRest:setResponse( cReturn )
return
3.3.12.2 Configuração
Observem o exemplo de configuração abaixo:
Nota: os trechos que estão ocultos foram substituídos por ... para facilitar a leitura. A configuração completa você
pode consultar aqui(see page 56)
2 - Configurações Avançadas – 78
TOTVSTEC – REST
[HTTPSERVER]
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Enable=1
Servers=HTTP_SRV
...
[HTTP_SRV]
locations=HTTP_ROOT
...
[HTTP_ROOT]
ThreadPool=THREAD_POOL
...
[THREAD_POOL]
UserExits=TP_UEX
...
Slaves=SLAVE_01,SLAVE_02
[TP_UEX]
OnSelect=U_OnSelect
OnError=U_OnError
[SLAVE_01]
UserExits=SLAVES_UEX
...
[SLAVE_02]
UserExits=SLAVES_UEX
...
[SLAVES_UEX]
OnStart=U_OnStart
OnStop=U_OnStop
OnError=U_OnError
Nesse exemplo de configuração, optamos por algo simples, ou seja, deixamos para a Thread principal
[THREAD_POOL] a responsabilidade de escolha das threads de atendimento, por isso configuramos a função de
Select e para as Threads de Slaves a responsabilidade de atendimento das requisições, dessa forma configuramos
para elas as funções de Start e Stop.
Note que o tratamento de erro, função de Error, deixamos configurado para todas as Threads, pois é comum à
todos.
Sendo assim, começamos agora a demonstrar como se utiliza a cada um dos Callback.
2 - Configurações Avançadas – 79
TOTVSTEC – REST
OnStart String
OnStop String
OnError String
OnSelect String
OnStart
Função que será executada na inicialização da thread.
OnStop
Função que será executada na finalização da thread.
OnError
Função que será executada caso ocorra algum erro na thread. Pode ser utilizada para tratar error.log, pois recebe o
objeto error como parâmetro permitindo customizar a saída desta informação.
OnSelect
Função que poderá ser executada para para selecionar quem atenderá a requisição.
Mais detalhes sobre User Exits, consulte aqui(see page 78)
Arquivo appserver.ini
[UE_01]
OnStart=ON_START_01
OnStop=ON_STOP_01
OnError=ON_ERROR_01
OnSelect=ON_SELECT_01
2 - Configurações Avançadas – 80
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
[UE_02]
OnStart=ON_START_02
OnStop=ON_STOP_02
OnError=ON_ERROR_02
OnSelect=ON_SELECT_02
JSON
jConfig['UE_01'] := JsonObject():new()
jConfig['UE_01']['OnStart'] := ON_START_01
jConfig['UE_01']['OnStop'] := ON_STOP_01
jConfig['UE_01']['OnError'] := ON_ERROR_01
jConfig['UE_01']['OnSelect'] := ON_SELECT_01
jConfig['UE_02'] := JsonObject():new()
jConfig['UE_02']['OnStart'] := ON_START_02
jConfig['UE_02']['OnStop'] := ON_STOP_02
jConfig['UE_02']['OnError'] := ON_ERROR_02
jConfig['UE_02']['OnSelect'] := ON_SELECT_02
2 - Configurações Avançadas – 81
TOTVSTEC – REST
4 3 - Funções de Usuário
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
O REST permite que o usuário possa customizar o comportamento padrão conforme lhe convenha.
Veja onde é possível customizar:
• Controle de Threads
• onStart (see page 85)
Inicialização da Thread
• Atendimento de Requisições
• onSelect(see page 83)
Escolha da qual Slave e/ou Thread irá atender a requisição
4.1 onError
Toda execução do REST é protegido pela camada do tlppCore, evitando falta de retorno ou outros efeitos colaterais
quando houver erros de runtime.
Embora haja um tratamento padrão para os erros, é possível customizar esse tratamento através de uma função
configurada através do onStop, sendo assim, o usuário pode por exemplo, enviar por e-mail o erro, gerar eventos
de monitoramento, ou seja, conforme a necessidade de cada um.
4.1.1 Parâmetros
A função customizada de tratamento de erro recebe o objeto oError, para mais detalhes sobre esse objeto, consulte
sua documentação no TDN10.
4.1.2 Retorno
Não há utilidade para retorno algum pois é ignorado, portanto sugerimos que o retorno seja NULL.
4.1.3 Exemplo
function U_onError( oError as object ) as void
10 https://tdn.totvs.com/display/tec/Classe+ErrorClass
3 - Funções de Usuário – 82
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
cFault += '{'
cFault += '"code":"' + cCodeTrace + '",'
cFault += '"message":"um erro interno ocorreu, procure o administrador do
sistema"'
cFault += '}'
return Nil
Nesse exemplo, padronizamos o retorno de mensagem com um código de rastro e deixamos para uma função de
Tratamento de erro U_TrataErro(), essa função estaria registrando o erro em local de fácil localização posterior
para que o administrador de sistema tome as devidas providências.
Esse é somente um exemplo do que pode ser feito através desse Callback.
Importante: Caso seja configurado o Callback de OnError e, nem na função configurada, nem momento anterior o
Código de Status ou a Mensagem de retorno tenha sido modificada pela implementação do usuário, a camada
tlppCore irá garantir que o serviço REST retorno o código 500 - Internal Server Error.
4.2 onSelect
Quando configuramos a infraestrutura do REST no INI do appserver, podemos criar diversos Thread Pools, ou seja,
conjuntos de threads disponíveis para o atendimento das requisições HTTP.
Porém, como é decidido qual thread de fato irá atender a requisição HTTP é algo que pode ser modificado. A
camada tlppCore tem seu algoritmo de distribuição das conexões, porém não é o foco desse documento explicar
como funciona, e sim ensinar como modificar esse algoritmo.
Importante ressaltar que ele te servirá não somente para modificar o algoritmo, mas dará o poder de decidir se a
requisição será atendida ou não, se a conexão deve ser encerrada imediatamente e até decidir que a partir de certo
momento, o tlppCore utilize o algoritmo padrão.
Basicamente, essa função tem que retornar o valor do índice correspondente ao Slave para o qual deseja indicar
como responsável pelo atendimento da requisição HTTP.
O índice pode ser encontrado buscando pela lista (array) retornado pelo método oRest:getThreadPoolSlaves(),
ficando a critério de quem implementa o algoritmo de busca e escolha.
Logo mais a baixo, iremos detalhar as demais opções e suas finalidades na sessão de retorno.
4.2.1 Parâmetros
A função customizada recebe 3 (três) parâmetros, sendo:
1 - cClassName
Nome da classe que foi implementada para a execução quando requisitado a "endpoint" correspondente do
serviço REST. (pode estar em branco)
2 - cFunctionName
3 - Funções de Usuário – 83
TOTVSTEC – REST
Nome da função ou do Método que foi implementado para a execução quando requisitado o endpoint
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
4.2.2 Retorno
O retorno dessa função deve ser do tipo numérico, indicando o índice correspondente do Slave contido na lista em
oRest:GetThreadPoolSlaves() na qual deseja que a Thread seja responsável pelo atendimento da requisição.
Pode-se retornar as seguintes opções:
• Maior que 0 (zero) >>
Índice do slave para qual deseja transferir a responsabilidade de atendimento.
• -1
Indica que deseja que o algoritmo do tlppCore seja o responsável pela escolha
• -2
Indica que não irá atender a essa requisição, porém deixa que o server responda para o cliente requisitante.
• -3
Derruba a conexão de modo silencioso, sem dar resposta para o cliente requisitante. Ex: útil para quando
detectar tentativa de invasão.
4.2.3 Exemplo
function restGrader( cClassName as character, cFunctionName as character,
cProgramType as character ) as integer
for na := 1 to len(aSlaves)
if ( aSlaves[nA]:ID == 6 ) // logica qualquer
nIndex := nA
endif
next
return nIndex
3 - Funções de Usuário – 84
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
4.3 onStart
Ao iniciar qualquer Thread destinada ao funcionamento do REST, existe a possibilidade de executar uma função de
Callback para que o usuário possa tomar ações que julgar necessário na criação da Thread.
Pode-se por ela, desde realizar operações de preparação de ambiente, até decidir que essa determinada Thread
não será iniciada.
4.3.1 Parâmetros
A função customizada não recebe parâmetros, porém é possível obter as informações pertinentes ao REST através
do objeto oRest.
4.3.2 Retorno
O retorno deve ser booleano para que funcione corretamente, e mesmo que a função retorne algo diferente do
exigido a camada tlppCore irá se proteger e converter o retorno para booleano, porém para esses casos sempre irá
considerar o valor como FALSE.
Sendo assim, o comportamento do REST fica:
Importante ressaltar que, existindo essa função e o valor considerado for FALSE, a Thread não será inicializada e
portanto será encerrada tão logo seja iniciada, não ficando disponível para uso. Logo, é preciso atenção para o
valor de retorno da função.
3 - Funções de Usuário – 85
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
4.3.3 Exemplo
user function onStart() as logical
return lOK
4.4 onStop
Essa função é análoga a onStart apesar de ocorrer no momento oposto, afinal a mesma é executada quando há a
finalização da thread independente do motivo, seja por algum erro/solicitação do servidor ou por execução de
algum processo externo. Sabendo-se disso, a função onStop não deve ser utilizada para ocorrências ou erros com
os objetos instanciados na execução das API's.
4.4.1 Parâmetros
A função customizada não recebe parâmetros.
4.4.2 Retorno
O retorno não tem funcionalidade para este Callback, portanto a camada tlppCore irá ignorar qualquer retorno
feito por essa função.
4.4.3 Exemplo
user function onStop() as logical
return lOK
Importante: Vale ressaltar que: o onStop é executado quando há finalização da thread ! Não devem ser
considerados para esta função, as informações dos objetos utilizados ao longo da execução da API, afinal
dependendo do momento em que ocorreu a finalização da thread o objeto em questão pode nem ter sido
instanciado. Porém, caso seja necessário obter alguma informação dos objetos criados, recomendamos sempre
proteger o acesso a estrutura dos mesmos.
3 - Funções de Usuário – 86
TOTVSTEC – REST
O objeto oRest é a interface que o desenvolvedor tem para acesso à todas as funcionalidades do REST no servidor.
Para entendê-lo melhor, leia toda essa documentação!
5.2.1 Body
Requisições HTTP podem enviar dados através do Body da mensagem e em nosso REST é possível resgatar esse
valor da seguinte forma:
#include "tlpp-core"
#include "tlpp-rest"
@Get("sample/request/body")
user function sampleBody()
cBody := oRest:getBodyRequest()
endif
oRest:setResponse( cReturn )
return
Note que fazemos uso do método oRest:getBodyRequest() para obter o conteúdo enviado por Body.
Esse método nos retorna no formato na qual está encapsulado na mensagem, portanto é preciso tratá-lo conforme
lhe for conveniente.
#include "tlpp-core"
#include "tlpp-rest"
@Get("sample/function/header")
user function sampleHeader()
jHeader := oRest:getHeaderRequest()
if ( jHeader <> Nil )
cReturn := "Parâmetros capturados: [" + jHeader:ToJSon() + "]"
endif
oRest:SetResponse( cReturn )
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
return
jHeader := oRest:getHeaderRequest()
cCode := jHeader[ 'code' ]
Do lado da execução do serviço, temos que nos ater não somente em como resgatar os valores, mas como também
em como prover, segue:
#include "tlpp-core"
#include "tlpp-rest"
@Get("sample/function/pathparamsexample/:code")
user function samplePathParamsExample()
local cReturn := ""
local jPathParams := Nil
jPathParams := oRest:getPathParamsRequest()
if jPathParams <> Nil
cReturn := "Parâmetros capturados: [" + jPathParams:ToJSon() + "]"
endif
oRest:SetResponse( cReturn )
return
Na definição do endpoint, já incluímos o parâmetro code em sua definição, e para que o REST entenda de que se
trata da uma variável, colocamos ":" antes do nome da variável.
Notem que na definição do endpoint inserimos a variável code da seguinte maneira:
@Get("sample/function/pathparamsexample/:code")
Ao indicar ":" antes de code, automaticamente estamos definindo que o valor passado nessa posição da URI será
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
nosso parâmetro de nome code e poderá ser variável, porém, para acessar esse serviço a requisição tem que
respeitar o endpoint completo, tornando o parâmetro obrigatório.
Para obter todos os parâmetros enviados via Path Param, fazemos uso do método
oRest:getPathParamsRequest().
Esse método já nos retorna em formato JSON, portanto, para acessar o dado de um determinado parâmetro, basta
seguir como abaixo:
jPathParams := oRest:getPathParamsRequest()
cCode := jPathParams[ 'code' ]
#include "tlpp-core"
#include "tlpp-rest"
@Get("sample/request/querystringexample")
user function sampleQueryString()
jQueryString := oRest:getQueryRequest()
if ( jQueryString <> Nil )
cReturn := "Parâmetros capturados: [" + jQueryString:ToJSon() + "]"
endif
oRest:setResponse(cReturn)
return
Note que fazemos uso do método oRest:getQueryRequest() para obter todos os parâmetros enviados via Query
String.
Esse método já nos retorna em formato JSON, portanto, para acessar o dado de um determinado parâmetro, basta
seguir como abaixo:
jQueryString := oRest:getQueryRequest()
cCode := jQueryString[ 'code' ]
@get("sample/setResponse_1")
user function sampleSetResponse_1()
oRest:setResponse( cReturn )
return
@get("sample/setResponse_2")
user function sampleSetResponse_2()
oRest:setResponse( '{"sample":"' )
if ( '_2' $ procname() )
oRest:setResponse( '2' )
else
oRest:setResponse( 'unknown' )
endif
oRest:setResponse( '"}' )
return
Note que nesse exemplo, a mensagem foi sendo construída em partes, ou seja, oRest:setResponse() vai
concatenando as mensagens enviadas.
@get("sample/setResponse_3")
user function sampleSetResponse_3()
oRest:setResponse( '{"sample":"0"}' )
5.3.2.1 Exemplo
#include "tlpp-core.th"
#include "tlpp-rest.th"
@get("sample/setResponse/Json")
user function sampleSetResponseJson()
oRest:setKeyHeaderResponse('Content-Type','application/json')
oRest:setResponse( '{"sample":"format"}' )
return
Mais detalhes sobre o método oRest:setKeyHeaderResponse()(see page 152)
11 https://tdn.totvs.com/display/tec/oRest%3AExistKeyHeaderResponse
@get("sample/setStatusCode_1")
user function sampleSetStatusCode_1()
jQuery := oRest:getQueryRequest()
if ( jQuery <> Nil )
cUser := jQuery[ 'user' ]
endif
if ( !empty( cUser ) )
cReturn := '{"user":"' + cUser + '","message":""}'
else
oRest:setStatusCode(400) // Bad Request
cReturn := '{"user":"","message":"invalid user"}'
endif
oRest:setResponse( cReturn )
return
@get("sample/setStatusCode_2")
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
oRest:setResponse( cReturn )
return
Note que nesse exemplo, antes de validar os parâmetros já setamos o Status Code como 400 e após verificarmos se
todos os parâmetros estão OK, voltamos ao Estado original..
@get("sample/setFault")
user function samplesetFault()
jQuery := oRest:getQueryRequest()
if ( jQuery <> Nil )
cUser := jQuery[ 'user' ]
endif
oRest:setFault( '{"admin":"no"}' )
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
endif
return
Note que utilizamos o método oRest:setFault, nele definimos a mensagem que gostaríamos de retornar, porém,
automaticamente o REST server já marca o Status Code como 500.
Caso deseje outro Status code, sugerimos utilizar a implementação do segundo exemplo.
Mais detalhes sobre o método oRest:setFault()(see page 151)
@get("sample/erro/mode_2")
user function sampleErrorMode2()
jQuery := oRest:getQueryRequest()
if ( jQuery <> Nil )
cUser := jQuery[ 'user' ]
endif
oRest:setResponse( cReturn )
return
Nesse caso, utilizamos um método para modificar o Status Code conforme nossa necessidade, pois 500 (Internal
Server Error) não determina o erro correto, e depois seguimos definindo a mensagem de retorno..
Mais detalhes sobre modificar o Status Code HTTP(see page 93)
5.4.1 Namespace
tlpp.rest
5.4.2 Hierarquia
• tObject12
• Rest
5.4.3 Propriedades
Rest:nThreadID13 Rest:URN14
5.4.4 Métodos
• oRest:appendKeyHeaderResponse(see page 99)
• oRest:deleteKeyHeaderResponse(see page 100)
• oRest:existKeyHeaderRequest(see page 101)
• oRest:getBodyRequest(see page 102)
• oRest:getCentryPointAuthorizationOnAuth(see page 103)
• oRest:getCentryPointAuthorizationScheme(see page 104)
• oRest:getCentryPointEnvironment(see page 105)
• oRest:getCentryPointError(see page 105)
• oRest:getCEntryPointExit(see page 106)
• oRest:getCEntryPointGrader(see page 107)
• oRest:getCloseAfterSend(see page 108)
• oRest:getConnectionRequest(see page 109)
• oRest:getHeaderRequest(see page 110)
• oRest:getHeaderResponse(see page 111)
• oRest:getKeyHeaderResponse(see page 112)
• oRest:getLentryPointAuthorization(see page 113)
• oRest:getLEntryPointExit(see page 114)
• oRest:getLEntryPointGrader(see page 115)
• oRest:getMethodRequest(see page 116)
• oRest:getPathParamsRequest(see page 117)
• oRest:getPathRequest(see page 118)
• oRest:getProtocolRequest(see page 118)
• oRest:getQueryRequest(see page 119)
• oRest:getRetCodResponse(see page 120)
• oRest:getRetMsgResponse(see page 121)
• oRest:getStatusResponse(see page 122)
• oRest:getThreadIdRequest(see page 123)
• oRest:getThreadPool_SvcId_TPType(see page 123)
• oRest:getThreadPoolAcceptTimeout(see page 124)
• oRest:getThreadPoolAuthorizationScheme(see page 125)
• oRest:getThreadPoolEnvironment(see page 126)
• oRest:getThreadPoolGrowthFactor(see page 127)
• oRest:getThreadPoolId(see page 128)
• oRest:getThreadPoolInactiveTimeout(see page 129)
• oRest:getThreadPoolMaxThreads(see page 130)
• oRest:getThreadPoolMinFreeThreads(see page 131)
12 //tdn.totvs.com/tObject
13 //tdn.totvs.com/properties%5CnThreadID.md
14 //tdn.totvs.com/properties%5CURN.md
5.4.4.1 Exemplos
User Function UsandoRest()
Return
5.4.4.2 Abrangência
19.0.0.0
5.4.5 oRest:appendKeyHeaderResponse
Adiciona um novo valor a uma chave do cabeçalho de resposta Header ResponseHeaderResponse. Observe que o
valor antigo da chave não é eliminado, o novo valor é concatenado a ele.
5.4.5.1 Sintaxe
appendKeyHeaderResponse( < cKey >, < cValue > )
5.4.5.2 Parâmetros
5.4.5.3 Retorno
5.4.5.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
// http://localhost:9090/api/testAppendKeyHeader
@Get("testAppendKeyHeader")
Function u_appendKeyHeaderExample()
Local lRet := .F.
Local cRet := "Append OK - Verifique o Header Response"
if ! oRest:setKeyHeaderResponse("Content-Type", "text/html")
cRet := "Erro ao setar text na chave content-type"
else
if !oRest:appendKeyHeaderResponse("Content-Type","charset=utf-8")
cRet := "Erro ao setar text na chave content-type"
endif
endif
return oRest:setResponse(cRet)
5.4.5.5 Abrangência
11/2019
5.4.6 oRest:deleteKeyHeaderResponse
Elima uma chave do cabeçalho de resposta Header ResponseHeaderResponse. Observe a RCF sobre 'Response
Header Fields' e veja que alguns campos não podem ser eliminados.
5.4.6.1 Sintaxe
deleteKeyHeaderResponse( < cKey > )
5.4.6.2 Parâmetros
5.4.6.3 Retorno
5.4.6.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
// http://localhost:9090/api/testDeleteKeyHeader
@Get("testDeleteKeyHeader")
Function u_DeleteKeyHeaderExample()
if !oRest:getKeyHeaderResponse("Allow")
cRet := "Fail"
endif
return oRest:setResponse(cRet)
5.4.6.5 Abrangência
11/2019
5.4.7 oRest:existKeyHeaderRequest
Responsável verificar se uma chave existe no header da requisição
5.4.7.1 Sintaxe
existKeyHeaderRequest( < cKey > )
5.4.7.2 Parâmetros
5.4.7.3 Retorno
5.4.7.4 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/existKeyHeaderRequest
5.4.7.5 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/existKeyHeaderRequest")
Function u_fExistKeyHeaderRequest()
Local cKey := "Connection"
Local cResponse := ""
Local lRet := .F.
lRet := oRest:existKeyHeaderRequest(cKey)
if (lRet)
cResponse := '{"existKeyHeaderRequest": "Chave ' + cKey + ' existe no
header da requisição' + '"}'
else
cResponse := '{"existKeyHeaderRequest": "Chave ' + cKey + ' não existe
endif
return oRest:setResponse(cResponse)
5.4.7.6 Abrangência
01/2020
5.4.8 oRest:getBodyRequest
Responsável por retornar o body da requisição HTTP
5.4.8.1 Sintaxe
oRest:getBodyRequest()
5.4.8.2 Retorno
5.4.8.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getBodyRequest
5.4.8.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getBodyRequest")
function u_fGetBodyRequest() as logical
cResp := '{'
cResp += '"getBodyRequest": ' + if( empty(cBody), 'false', 'true' )
cResp += ','
cResp += '"lenght":' + cValToChar( len(cBody) )
cResp += '}'
oRest:setKeyHeaderResponse('Content-Type','application/json')
oRest:setResponse( cResp )
return .T.
5.4.8.5 Abrangência
07/2019
5.4.9 oRest:getCentryPointAuthorizationOnAuth
Para a autenticação Basic, é possível determinar qual função irá fazer a verificação do usuário e senha enviados
pela requisição. Esse método retorna o nome da função configurada.
5.4.9.1 Sintaxe
getCEntryPointAuthorizationOnAuth()
5.4.9.2 Retorno
5.4.9.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getEntryPointAuth")
Function u_getEntryPointAuth()
Local cRet := ""
cRet := oRest:getCEntryPointAuthorizationOnAuth()
if (cRet != "")
conout("O ponto de função para realizar a autenticação para as
requisições HTTP é: " + cRet)
else
conout("Nao foi configurado ponto de função para realizar a autenticação
para as requisições HTTP.")
endif
return oRest:setResponse(cRet)
5.4.9.4 Abrangência
04/2020
5.4.10 oRest:getCentryPointAuthorizationScheme
Retorna valor da propriedade privada referente ao nome da função do Entry Point
5.4.10.1 Sintaxe
getCentryPointAuthorizationScheme()
5.4.10.2 Retorno
5.4.10.3 Observações
• Para executar o exemplo faça uma chamada get para o endPoint"/documentation/
getCentryPointAuthorizationScheme""/documentation/getCentryPointAuthorizationScheme"
5.4.10.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getCentryPointAuthorizationScheme")
Function u_getCentryPointAuthorizationScheme()
Local cResponse := ""
return oRest:setResponse(cResponse)
5.4.10.5 Abrangência
04/2020
5.4.11 oRest:getCentryPointEnvironment
É possível configurar uma função de callback, para que o usuário realize o processamento que julgar necessário, a
ser executada na criação de uma thread destinada ao REST. Esse método retorna o nome da função configurada.
5.4.11.1 Sintaxe
getCentryPointEnvironment()
5.4.11.2 Retorno
5.4.11.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getEntryPoint")
Function u_getEntryPoint()
Local cRet := ""
cRet := oRest:getCentryPointEnvironment()
if (cRet != "")
conout("O ponto de função para preparação de ambiente é: " + cRet)
else
conout("Nao foi configurado ponto de função para preparação de ambiente")
endif
return
5.4.11.4 Abrangência
04/2020
5.4.12 oRest:getCentryPointError
É possível configurar uma função de callback, para que o usuário customize o tratamento de erros. Esse método
retorna o nome da função configurada.
5.4.12.1 Sintaxe
getCentryPointError()
5.4.12.2 Retorno
5.4.12.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getEntryPointError")
Function u_getEntryPointError()
Local cRet := ""
cRet := oRest:getCentryPointError()
if (cRet != "")
conout("O ponto de função para realizar o tratamento de erros é: " +
cRet)
else
conout("Nao foi configurado ponto de função para tratamento de erros.")
endif
return oRest:setResponse(cRet)
5.4.12.4 Abrangência
04/2020
5.4.13 oRest:getCEntryPointExit
Quando ocorre a finalização de uma thread de atendimento REST, uma função de callback pode ser chamada para
que o usuário realize o processamento que julgar necessário. sse método retorna o nome da função configurada.
5.4.13.1 Sintaxe
getCEntryPointExit()
5.4.13.2 Retorno
5.4.13.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getEntryPointExit")
Function u_getEntryPointExit()
Local cRet := ""
cRet := oRest:getCentryPointExit()
if (cRet != "")
conout("O ponto de função para realizar tratamento na finalização da
thread é: " + cRet)
else
conout("Nao foi configurado ponto de função para tratamento na
finalização da thread.")
endif
return oRest:setResponse(cRet)
5.4.13.4 Abrangência
04/2020
5.4.14 oRest:getCEntryPointGrader
Retorna valor da propriedade privada referente ao nome da função do Entry Point
5.4.14.1 Sintaxe
getCEntryPointGrader()
5.4.14.2 Retorno
5.4.14.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getEntryPointGrader")
Function u_getEntryPointGrader()
Local cRet := ""
cRet := oRest:getCEntryPointGrader()
if (cRet != "")
conout("O ponto de função para realizar o balanceamento de threads é: "
+ cRet)
else
conout("Nao foi configurado ponto de função para balanceamento de
threadas.")
endif
return oRest:setResponse(cRet)
5.4.14.4 Abrangência
04/2020
5.4.15 oRest:getCloseAfterSend
Responsável por retornar o valor de definição para o encerramento da sessão após a requisição
5.4.15.1 Sintaxe
getCloseAfterSend()
5.4.15.2 Retorno
5.4.15.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getCloseAfterSend
5.4.15.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getCloseAfterSend")
Function u_fGetCloseAfterSend()
Local cResponse := ""
Local lRet := .F.
lRet := oRest:getCloseAfterSend()
cResponse := '{"getCloseAfterSend": "Neste momento, deve ser .F.: ' +
cValToChar(lRet) + '"}'
return oRest:setResponse(cResponse)
5.4.15.5 Abrangência
06/2020
5.4.16 oRest:getConnectionRequest
Responsável por retornar a conexão utilizada na requisição
5.4.16.1 Sintaxe
getConnectionRequest()
5.4.16.2 Retorno
5.4.16.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getConnectionRequest
5.4.16.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getConnectionRequest")
Function u_fGetConnectionRequest()
Local cResponse := ""
Local nConnection := ""
nConnection := oRest:getConnectionRequest()
if (valtype(nConnection) == 'N')
cResponse := '{"getConnectionRequest": "' + cValToChar(oRest:getConnecti
onRequest()) + '"}'
else
cResponse := '{"getConnectionRequest": "método getConnectionRequest não
foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.16.5 Abrangência
01/2020
5.4.17 oRest:getHeaderRequest
Responsável por retornar o header da requisição
5.4.17.1 Sintaxe
getHeaderRequest()
5.4.17.2 Retorno
5.4.17.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getHeaderRequest
5.4.17.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getHeaderRequest")
Function u_fGetHeaderRequest()
Local cResponse := ""
Local jHeader
jHeader := oRest:getHeaderRequest()
if (valtype(jHeader) == 'J')
cResponse := '{"Header":['
cResponse += jHeader:toJson()
cResponse += ']}'
else
cResponse := '{"getHeaderRequest": "método getHeaderRequest não foi
executado"}'
endif
return oRest:setResponse(cResponse)
5.4.17.5 Abrangência
10/2019
5.4.18 oRest:getHeaderResponse
Retorna o Header Response da requisição
5.4.18.1 Sintaxe
getHeaderResponse()
5.4.18.2 Retorno
5.4.18.3 Observações
• Para visualizar este exemplo, execute seu serviço rest com a URI: /documentation/getHeaderResponse
5.4.18.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getHeaderResponse")
Function u_fgetHeaderResponse()
Local cResponse := ""
jResp := oRest:getHeaderResponse()
5.4.18.5 Abrangência
11/2019
5.4.19 oRest:getKeyHeaderResponse
Retorna o valor de uma chave do Header do objeto Response da requisição
5.4.19.1 Sintaxe
getKeyHeaderResponse( < cKey >, < cValue > )
5.4.19.2 Parâmetros
5.4.19.3 Retorno
5.4.19.4 Observações
• Para visualizar o exemplo, execute o rest no endereço :"/documentation/getKeyHeaderResponse"
5.4.19.5 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getKeyHeaderResponse")
Function u_fgetKeyHeaderResponse()
Local lRet := .F.
Local cRet := ''
5.4.19.6 Abrangência
11/2019
5.4.20 oRest:getLentryPointAuthorization
Para a autenticação Basic, é possível determinar qual função irá fazer a verificação do usuário e senha enviados
pela requisição. Esse método indica se essa configuração foi realizada ou não.
5.4.20.1 Sintaxe
getLentryPointAuthorization()
5.4.20.2 Retorno
5.4.20.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/existEntryPointAuth")
Function u_existEntryPointAuth()
Local lRet := .F.
lRet := oRest:getLentryPointAuthorization()
if (lRet)
conout("Foi configurado um ponto de função para realizar a autenticação
para as requisições HTTP: " + oRest:getCentryPointAuthorizationOnAuth())
else
conout("Nao foi configurado ponto de função para realizar a autenticação
para as requisições HTTP.")
endif
return oRest:setResponse(lRet)
5.4.20.4 Abrangência
04/2020
5.4.21 oRest:getLEntryPointExit
Quando ocorre a finalização de uma thread de atendimento REST, uma função de callback pode ser chamada para
que o usuário realize o processamento que julgar necessário. Esse método informa se essa função foi ou não
configurada.
5.4.21.1 Sintaxe
getLEntryPointExit()
5.4.21.2 Retorno
5.4.21.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/existEntryPointExit")
Function u_existEntryPointExit()
Local lRet := .F.
lRet := oRest:getLEntryPointExit()
if (lRet)
conout("Foi configurado um ponto de função para finalização da thread: "
+ oRest:getCEntryPointExit())
else
conout("Nao foi configurado ponto de função para finalização da thread.")
endif
return oRest:setResponse(lRet)
5.4.21.4 Abrangência
04/2020
5.4.22 oRest:getLEntryPointGrader
Retorna valor da propriedade privada referente se existe Entry Point
5.4.22.1 Sintaxe
getLEntryPointGrader()
5.4.22.2 Retorno
5.4.22.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/existEntryPointGrader")
Function u_existEntryPointGrader()
Local lRet := .F.
lRet := oRest:getLEntryPointGrader()
if (lRet)
conout("Foi configurado um ponto de função para o balanceamento de
threads: " + oRest:getCentryPointGrader())
else
conout("Nao foi configurado ponto de função o balanceamento de threads")
endif
return oRest:setResponse(lRet)
5.4.22.4 Abrangência
04/2020
5.4.23 oRest:getMethodRequest
Retorna qual o método executado para acessar o endpoint
5.4.23.1 Sintaxe
getMethodRequest()
5.4.23.2 Retorno
5.4.23.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
// http:localhost:9090/api/minhaURL
@Get("minhaURL")
Function u_getMethodExample()
Local creturn := ""
creturn := oRest:getMethodRequest()
conout(cReturn) // Vai exibir GET
creturn := "{'Method':" + creturn + "}"
oRest:SetResponse(cReturn)
Return
5.4.23.4 Abrangência
07/2019
5.4.24 oRest:getPathParamsRequest
Responsável por retornar os parâmetros informados na requisição via URI (path param)
5.4.24.1 Sintaxe
getPathParamsRequest()
5.4.24.2 Retorno
5.4.24.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getPathParamsRequest/
TOTVS
5.4.24.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getPathParamsRequest/:cKey")
Function u_fGetPathParamsRequest()
local cResponse := ""
local cRet := ""
local jParams := JsonObject():New()
jParams := oRest:getPathParamsRequest()
cRet := jParams['cKey']
if (valtype(cRet) == 'C')
cResponse := '{"getPathParamsRequest":"' + cValToChar(cRet) + '"}' //cRet
vai ter valor igual a "TOTVS"
else
cResponse := '{"getPathParamsRequest": "metodo getPathParamsRequest nao
foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.24.5 Abrangência
07/2019
5.4.25 oRest:getPathRequest
return the path address of requisition
5.4.25.1 Sintaxe
getPathRequest()
5.4.25.2 Retorno
5.4.25.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
// http:localhost:9090/api/mypath/teste
@Get("mypath/teste")
Function u_getPathExample()
Local creturn := ""
creturn := oRest:getPathRequest()
conout(cReturn) // Vai exibir a URN da requisição, por exemplo
http:localhost:9090/api/mypath/teste
creturn := "{'Path':" + creturn + "}"
oRest:SetResponse(cReturn)
Return
5.4.25.4 Abrangência
01/2020
5.4.26 oRest:getProtocolRequest
Getter para o protocolo de comunicação utilizado na requisição.
5.4.26.1 Sintaxe
getProtocolRequest()
5.4.26.2 Retorno
5.4.26.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
// http:localhost:9090/api/protocolo
@Get("protocolo")
Function u_getProtocolExample()
Local creturn := ""
creturn := oRest:getMethodRequest()
conout(cReturn) // Vai exibir o protocolo utilizado a requisição, por
exemplo HTTP
creturn := "{'Protocol':" + creturn + "}"
oRest:SetResponse(cReturn)
Return
5.4.26.4 Abrangência
01/2020
5.4.27 oRest:getQueryRequest
Responsável por retornar os parâmetros informados na requisição via URI (query param)
5.4.27.1 Sintaxe
getQueryRequest()
5.4.27.2 Retorno
5.4.27.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getQueryRequest/user?
user=TOTVS
5.4.27.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getQueryRequest/user")
Function u_fGetQueryRequest()
local cResponse := ""
local cRet := ""
local jParams := JsonObject():New()
jParams := oRest:getQueryRequest()
cRet := jParams['user']
if (valtype(cRet) == 'C')
cResponse := '{"getQueryRequest":"' + cValToChar(cRet) + '"}'
else
cResponse := '{"getQueryRequest": "metodo getQueryRequest nao foi
executado"}'
endif
return oRest:setResponse(cResponse)
5.4.27.5 Abrangência
07/2019
5.4.28 oRest:getRetCodResponse
Responsável por retornar o código de status do HTTP contido no objeto oRest
5.4.28.1 Sintaxe
getRetCodResponse()
5.4.28.2 Retorno
5.4.28.3 Observações
• Aconselhamos sempre utilizar o método getStatusResponse() para consulta do valor que será retornado.
Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getRetCodResponse
5.4.28.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getRetCodResponse")
Function u_fGetRetCodResponse()
local cResponse := ""
local nRet := -1
nRet := oRest:getRetCodResponse()
if (valtype(nRet) == 'N' .and. nRet >= 0)
cResponse := '{"getRetCodResponse":"' + cValToChar(nRet) + '"}'
else
cResponse := '{"getRetCodResponse": "método getRetCodResponse não foi
executado"}'
endif
return oRest:setResponse(cResponse)
5.4.28.5 Abrangência
01/2020
5.4.29 oRest:getRetMsgResponse
Responsável por retornar a mensagem do HTTP contido no objeto oRest
5.4.29.1 Sintaxe
getRetMsgResponse()
5.4.29.2 Retorno
5.4.29.3 Observações
• Aconselhamos sempre utilizar o método getBodyResponse() para consulta do valor que será retornado.
Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getRetMsgResponse
5.4.29.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getRetMsgResponse")
Function u_fGetRetMsgResponse()
local cResponse := ""
local cRet := ""
cRet := oRest:getRetMsgResponse()
if (valtype(cRet) == 'C')
cResponse := '{"getRetMsgResponse":"' + cValToChar(cRet) + '"}'
else
cResponse := '{"getRetMsgResponse": "método getRetMsgResponse não foi
executado"}'
endif
return oRest:setResponse(cResponse)
5.4.29.5 Abrangência
01/2020
5.4.30 oRest:getStatusResponse
Retorna o código de status do HTTP que será considerado no retorno da requisição até o momento da pesquisa.
5.4.30.1 Sintaxe
getStatusResponse()
5.4.30.2 Retorno
5.4.30.3 Observações
• Esse código está guardado na camada tlppCore e só será enviado a camada do appserver no momento de
efetivar a resposta ao requisitante.
5.4.30.4 Exemplos
nCodeHttp := oRest:getStatusResponse()
5.4.30.5 Abrangência
07/2019
5.4.31 oRest:getThreadIdRequest
Responsável por retornar o ID da thread da requisição
5.4.31.1 Sintaxe
getThreadIdRequest()
5.4.31.2 Retorno
5.4.31.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getThreadIdRequest
5.4.31.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getThreadIdRequest")
Function u_fGetThreadIdRequest()
Local cResponse := ""
Local nConnection := ""
nConnection := oRest:getThreadIdRequest()
if (valtype(nConnection) == 'N')
cResponse := '{"getThreadIdRequest": "' + cValToChar(oRest:getThreadIdRe
quest()) + '"}'
else
cResponse := '{"getThreadIdRequest": "método getThreadIdRequest não foi
executado"}'
endif
return oRest:setResponse(cResponse)
5.4.31.5 Abrangência
01/2020
5.4.32 oRest:getThreadPool_SvcId_TPType
Retorna o identificador do serviço e qual é o tipo do threadpool que recebeu a requisição
5.4.32.1 Sintaxe
getThreadPool_SvcId_TPType()
5.4.32.2 Retorno
5.4.32.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/
getThreadPool_SvcId_TPType
5.4.32.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPool_SvcId_TPType')
function u_fGetThreadPool_SvcId_TPType()
local cResponse := ""
local cRet := oRest:getThreadPool_SvcId_TPType()
if (valtype(cRet) == 'C')
cResponse := '{"getThreadPool_SvcId_TPType":"' + "As informacoes do
threadpool " + oRest:getThreadPoolName() + " sao: " + cRet + '"}'
else
cResponse := '{"getThreadPool_SvcId_TPType": "metodo
getThreadPool_SvcId_TPType nao foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.32.5 Abrangência
01/2020
5.4.33 oRest:getThreadPoolAcceptTimeout
Responsável por retornar o tempo limite para aceitar (accept timeout) configurada para o threadpool que recebe a
requisição
5.4.33.1 Sintaxe
getThreadPoolAcceptTimeout()
5.4.33.2 Retorno
5.4.33.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/
getThreadPoolAcceptTimeout
5.4.33.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPoolAcceptTimeout')
function u_fGetThreadPoolAcceptTimeout()
local cResponse := ""
local nQtd := oRest:getThreadPoolAcceptTimeout()
if (valtype(nQtd) == 'N')
cResponse := '{"getThreadPoolAcceptTimeout":"' + cValToChar(nQtd) + " eh
accept timeout configurado para o threadpool " + oRest:getThreadPoolName() +
'"}'
else
cResponse := '{"getThreadPoolAcceptTimeout": "metodo
getThreadPoolAcceptTimeout nao foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.33.5 Abrangência
01/2020
5.4.34 oRest:getThreadPoolAuthorizationScheme
Retorna qual é o tipo de autenticação que o serviço usará.
5.4.34.1 Sintaxe
getThreadPoolAuthorizationScheme()
5.4.34.2 Retorno
5.4.34.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPoolAuthorizationScheme')
Function u_authorizationType()
Local cRet := oRest:getThreadPoolAuthorizationScheme()
return
5.4.34.4 Abrangência
05/2020
5.4.35 oRest:getThreadPoolEnvironment
Responsável por retornar em qual ambiente (environment) o threadpool que recebeu a requisição está configurado
5.4.35.1 Sintaxe
getThreadPoolEnvironment()
5.4.35.2 Retorno
5.4.35.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getThreadPoolEnvironment
5.4.35.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPoolEnvironment')
function u_fGetThreadPoolEnvironment()
local cResponse := ""
local cRet := oRest:getThreadPoolEnvironment()
if (valtype(cRet) == 'C')
cResponse := '{"getThreadPoolEnvironment":"' + cRet + " eh environment
(ambiente) que o threadpool " + oRest:getThreadPoolName() + " esta configurado"
+ '"}'
else
cResponse := '{"getThreadPoolEnvironment": "metodo
getThreadPoolEnvironment nao foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.35.5 Abrangência
01/2020
5.4.36 oRest:getThreadPoolGrowthFactor
Responsável por retornar o fator de crescimento da thread no threadpool que recebeu a requisição
5.4.36.1 Sintaxe
getThreadPoolGrowthFactor()
5.4.36.2 Retorno
5.4.36.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getThreadPoolGrowthFactor
5.4.36.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPoolGrowthFactor')
function u_fGetThreadPoolGrowthFactor()
local cResponse := ""
local nRet := oRest:getThreadPoolGrowthFactor()
if (valtype(nRet) == 'N')
cResponse := '{"getThreadPoolGrowthFactor":"' + cValToChar(nRet) + " eh
growth factor (fator de crescimento das threads) configurado para o threadpool "
+ oRest:getThreadPoolName() + "}'
else
cResponse := '{"getThreadPoolGrowthFactor": "metodo
getThreadPoolGrowthFactor nao foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.36.5 Abrangência
01/2020
5.4.37 oRest:getThreadPoolId
Retorna o identificador do threadpool que recebeu a requisição
5.4.37.1 Sintaxe
getThreadPoolId()
5.4.37.2 Retorno
5.4.37.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getThreadPoolId
5.4.37.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPoolId')
function u_fGetThreadPoolId()
local cResponse := ""
local nRet := oRest:getThreadPoolId()
if (valtype(nRet) == 'N')
cResponse := '{"getThreadPoolId":"' + "O ID do threadpool " + oRest:getThrea
dPoolName() + " eh: " + cValToChar(nRet) + '"}'
else
cResponse := '{"getThreadPoolId": "metodo getThreadPoolId nao foi
executado"}'
endif
return oRest:setResponse(cResponse)
5.4.37.5 Abrangência
01/2020
5.4.38 oRest:getThreadPoolInactiveTimeout
Responsável por retornar o tempo limite de inatividade configurada para o threadpool que recebe a requisição
5.4.38.1 Sintaxe
getThreadPoolInactiveTimeout()
5.4.38.2 Retorno
5.4.38.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/
getThreadPoolInactiveTimeout
5.4.38.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPoolInactiveTimeout')
function u_fGetThreadPoolInactiveTimeout()
local cResponse := ""
local nRet := oRest:getThreadPoolInactiveTimeout()
if (valtype(nRet) == 'N')
cResponse := '{"getThreadPoolAcceptTimeout":"' + cValToChar(nRet) + " eh
accept timeout configurado para o threadpool " + oRest:getThreadPoolName() +
'"}'
else
5.4.38.5 Abrangência
01/2020
5.4.39 oRest:getThreadPoolMaxThreads
Responsável por retornar a quantidade máxima de threads que poderão ficar no ar para o threadpool que recebe a
requisição
5.4.39.1 Sintaxe
getThreadPoolMaxThreads()
5.4.39.2 Retorno
5.4.39.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getThreadPoolMaxThreads
5.4.39.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPoolMaxThreads')
function u_fGetThreadPoolMaxThreads()
local cResponse := ""
local nQtd := oRest:getThreadPoolMaxThreads()
if (valtype(nQtd) == 'N')
cResponse := '{"getThreadPoolMaxThreads":"' + cValToChar(nQtd) + " eh o
numero maximo de threads que atendem o threadpool " + oRest:getThreadPoolName()
+ '"}'
else
cResponse := '{"getThreadPoolMaxThreads": "metodo getThreadPoolMaxThreads
nao foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.39.5 Abrangência
01/2020
5.4.40 oRest:getThreadPoolMinFreeThreads
Responsável por retornar o número mínimo de threads que devem ficar disponíveis configurado no threadpool que
recebeu a requisição
5.4.40.1 Sintaxe
getThreadPoolMinFreeThreads()
5.4.40.2 Retorno
5.4.40.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/
getThreadPoolMinFreeThreads
5.4.40.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPoolMinFreeThreads')
function u_fGetThreadPoolMinFreeThreads()
local cResponse := ""
local nRet := oRest:getThreadPoolMinFreeThreads()
if (valtype(nRet) == 'N')
cResponse := '{"getThreadPoolMinFreeThreads":"' + cValToChar(nRet) + " eh o
numero minimo de threads que esta configurado para ficarem disponiveis no
threadpool " + oRest:getThreadPoolName() + '"}'
else
cResponse := '{"getThreadPoolMinFreeThreads": "metodo
getThreadPoolMinFreeThreads nao foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.40.5 Abrangência
01/2020
5.4.41 oRest:getThreadPoolMinThreads
Responsável por retornar a quantidade mínima de threads que ficarão no ar para o threadpool que recebe a
requisição
5.4.41.1 Sintaxe
getThreadPoolMinThreads()
5.4.41.2 Retorno
5.4.41.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getThreadPoolMinThreads
5.4.41.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPoolMinThreads')
function u_fGetThreadPoolMinThreads()
local cResponse := ""
local nQtd := oRest:getThreadPoolMinThreads()
if (valtype(nQtd) == 'N')
cResponse := '{"getThreadPoolMinThreads":"' + cValToChar(nQtd) + " eh o
numero minimo de threads que atendem o threadpool " + oRest:getThreadPoolName()
+ '"}'
else
cResponse := '{"getThreadPoolMinThreads": "metodo getThreadPoolMinThreads
nao foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.41.5 Abrangência
01/2020
5.4.42 oRest:getThreadPoolName
Retorna o nome da ThreadPool que recebeu a requisição, que corresponde a configuração na sessão [ThreadPool]
do arquivo de configuração do AppServer para o serviço REST em uso
5.4.42.1 Sintaxe
getThreadPoolName()
5.4.42.2 Retorno
5.4.42.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getThreadPoolName
5.4.42.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPoolName')
function u_fGetThreadPoolName()
local cResponse := ""
local cRet := oRest:getThreadPoolName()
if (valtype(cRet) == 'C')
cResponse := '{"getThreadPoolName":"' + "Nome do threadpool: " + cRet + '"}'
else
cResponse := '{"getThreadPoolName": "metodo getThreadPoolName nao foi
executado"}'
endif
return oRest:setResponse(cResponse)
5.4.42.5 Abrangência
01/2020
5.4.43 oRest:getThreadPoolServerUserData
Responsável por retornar a configuração exclusiva do desenvolver parametrizada no seu serviço rest
5.4.43.1 Sintaxe
getThreadPoolServerUserData()
5.4.43.2 Retorno
5.4.43.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/
getThreadPoolServerUserData Se o retorno for igual a "{}", significa essa configuração não foi definida.
5.4.43.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getThreadPoolServerUserData")
Function u_fGetThreadPoolServerUserData()
local cResponse := ""
local jRet
jRet := oRest:getThreadPoolServerUserData()
if (valtype(jRet) == 'J')
cResponse := '{"getThreadPoolServerUserData":"' + jRet:toJSON() + '"}'
else
cResponse := '{"getThreadPoolServerUserData": "metodo
getThreadPoolServerUserData nao foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.43.5 Abrangência
05/2020
5.4.44 oRest:getThreadPoolServiceId
Ao configurarmos o HTTPServer informamos quais servidores seráo ativados. E para cada servidor, definimos uma
lista especificando qual(is) thread pool poderá(ão) executar as requisições REST que chegarem para esse servidor.
O método getThreadPoolServiceId() retorna o identificador (id) do servidor para o qual o thread pool corrente está
processando.
5.4.44.1 Sintaxe
getThreadPoolServiceId()
5.4.44.2 Retorno
5.4.44.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPoolServiceId')
Function u_GetServiceId()
Local nRet := oRest:getThreadPoolServiceId()
Return
5.4.44.4 Abrangência
01/2020
5.4.45 oRest:getThreadPoolServiceName
O método getThreadPoolServiceName() retorna o nome do servidor para o qual o thread pool corrente está
processando. Esse nome foi informado na configuração do serviço, seja via arquivo de inicialização do AppServer
(.ini) ou por uma função TLPP (inicializa o HTTP server passando um json como parâmetro).
5.4.45.1 Sintaxe
getThreadPoolServiceName()
5.4.45.2 Retorno
5.4.45.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getThreadPoolServiceName
5.4.45.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getThreadPoolServiceName")
Function u_fGetThreadPoolServiceName()
local cResponse := ""
local cRet := ""
cRet := oRest:getThreadPoolServiceName()
if (valtype(cRet) == 'C')
cResponse := '{"getThreadPoolServiceName":"' + cValToChar(cRet) + '"}'
else
cResponse := '{"getThreadPoolServiceName": "metodo
getThreadPoolServiceName nao foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.45.5 Abrangência
01/2020
5.4.46 oRest:getThreadPoolServicePort
O método getThreadPoolServicePort() retorna o porta do serviço para o qual o thread pool corrente está
processando. Essa porta foi informado na configuração do serviço, seja via arquivo de inicialização do AppServer
(.ini) ou por uma função TLPP (inicializa o HTTP server passando um json como parâmetro).
5.4.46.1 Sintaxe
getThreadPoolServicePort()
5.4.46.2 Retorno
5.4.46.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getThreadPoolServiceName
5.4.46.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getThreadPoolServicePort")
Function u_fGetThreadPoolServicePort()
local cResponse := ""
local nRet := -1
nRet := oRest:getThreadPoolServicePort()
if (valtype(nRet) == 'N' .and. nRet >= 0)
cResponse := '{"getThreadPoolServicePort":"' + cValToChar(nRet) + '"}'
else
cResponse := '{"getThreadPoolServicePort": "metodo
getThreadPoolServicePort nao foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.46.5 Abrangência
01/2020
5.4.47 oRest:getThreadPoolServiceSSL
O método getThreadPoolServiceSSL() retorna se o serviço para o qual o thread pool corrente está processando
utiliza o protocolo de segurança SSL.
5.4.47.1 Sintaxe
getThreadPoolServiceSSL()
5.4.47.2 Retorno
5.4.47.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getThreadPoolServiceSSL
5.4.47.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getThreadPoolServiceSSL")
Function u_fGetThreadPoolServiceSSL()
local cResponse := ""
local lRet := oRest:getThreadPoolServiceSSL()
if (valtype(lRet) == 'L')
cResponse := '{"getThreadPoolServiceSSL":"' + cValToChar(lRet) + '"}'
else
cResponse := '{"getThreadPoolServiceSSL": "metodo getThreadPoolServiceSSL
nao foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.47.5 Abrangência
01/2020
5.4.48 oRest:getThreadPoolSlaves
Método responsável por retornar os slaves parametrizados para o threadpool que recebeu a requisição
5.4.48.1 Sintaxe
getThreadPoolSlaves()
5.4.48.2 Retorno
5.4.48.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getThreadPoolSlaves
5.4.48.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getThreadPoolSlaves")
Function u_fGetThreadPoolSlaves()
local aSlaves
local cResponse := ""
local nIndex := 0
local nLenSlaves := -1
aSlaves := oRest:getThreadPoolSlaves()
nLenSlaves := len(aSlaves)
if (valtype(aSlaves) == 'A')
if (nLenSlaves > 0)
cResponse := '{'
cResponse += '{"ThreadPool":"' + oRest:getThreadPoolName() + '"}'
cResponse += ',{"Total Slaves":"' + cValToChar(nLenSlaves) + '"}'
5.4.48.5 Abrangência
10/2019
5.4.49 oRest:getThreadPoolStatus
Responsável por retornar o status do threadpool que recebeu a requisição
5.4.49.1 Sintaxe
getThreadPoolStatus()
5.4.49.2 Retorno
5.4.49.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getThreadPoolStatus
5.4.49.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPoolStatus')
function u_fGetThreadPoolStatus()
local aStatus := {"STOPPED","STARTING","STARTED","STOPPING"}
local cResponse := ""
local nRet := oRest:getThreadPoolStatus()
if (valtype(nRet) == 'N')
cResponse := '{"getThreadPoolStatus":"O status do threadpool ' + oRest:getTh
readPoolName() + " eh: " + cValToChar(nRet) + "(" + aStatus[nRet] + ")" + '"}'
else
cResponse := '{"getThreadPoolStatus": "metodo getThreadPoolStatus nao foi
executado"}'
endif
return oRest:setResponse(cResponse)
5.4.49.5 Abrangência
01/2020
5.4.50 oRest:getThreadPoolType
Responsável por retornar qual é o tipo do threadpool que recebeu a requisição. Os retornos possíveis são 'Slave' ou
'Master'
5.4.50.1 Sintaxe
getThreadPoolType()
5.4.50.2 Retorno
5.4.50.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getThreadPoolType
5.4.50.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPoolType')
function u_fGetThreadPoolType()
local cResponse := ""
local cRet := oRest:getThreadPoolType()
if (valtype(cRet) == 'C')
cResponse := '{"getThreadPoolType":"' + cRet + " eh tipo do threadpool " +
oRest:getThreadPoolName() + " esta configurado" + '"}'
else
cResponse := '{"getThreadPoolType": "metodo getThreadPoolType nao foi
executado"}'
endif
return oRest:setResponse(cResponse)
5.4.50.5 Abrangência
01/2020
5.4.51 oRest:getThreadPoolUserData
Responsável por retornar a configuração exclusiva do desenvolver parametrizada no threadpool do seu serviço rest
5.4.51.1 Sintaxe
getThreadPoolUserData()
5.4.51.2 Retorno
5.4.51.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/getThreadPoolUserData Se o
retorno for igual a "{}", significa essa configuração não foi definida.
5.4.51.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getThreadPoolUserData")
Function u_fGetThreadPoolUserData()
local cResponse := ""
local jRet
jRet := oRest:getThreadPoolUserData()
if (valtype(jRet) == 'J')
cResponse := '{"getThreadPoolUserData":"' + jRet:toJSON() + '"}'
else
cResponse := '{"getThreadPoolUserData": "metodo getThreadPoolUserData nao
foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.51.5 Abrangência
05/2020
5.4.52 oRest:getThreadPoolUserExitName
Retorna o valor da chave [UserExits] configurada na Thread Pool ou na Thread Slave. O conteúdo desse valor,
significa o nome da sessão que deverá existir na INI ou Json de Init do Rest Server onde será possível configurar
todas as funções de usuários disponíveis para modificar funcionalidades padronizadas do REST.
5.4.52.1 Sintaxe
getThreadPoolUserExitName()
5.4.52.2 Retorno
5.4.52.3 Exemplos
cUsrName := oRest:getThreadPoolUserExitName()
5.4.52.4 Abrangência
01/2020
5.4.53 oRest:getThreadPoolUserExitOnError
Retorna o valor da chave [OnError] configurada na sessão definida em [UserExits]. O conteúdo desse valor,
significa o nome da função que será executada no momento que houver um error.log e o tlppCore desviará para
que essa função faça o tratamento de erro, enviando via parâmetro a classe de erro.
5.4.53.1 Sintaxe
getThreadPoolUserExitOnError()
5.4.53.2 Retorno
5.4.53.3 Exemplos
cFuncError := oRest:getThreadPoolUserExitOnError()
5.4.53.4 Abrangência
01/2020
5.4.54 oRest:getThreadPoolUserExitOnSelect
Retorna o valor da chave [OnSelect] configurada na sessão definida em [UserExits]. O conteúdo desse valor,
significa o nome da função que será executada no momento que o servidor REST receber uma nova requisição e
decidir para qual Thread irá encaminhar o processamento.
5.4.54.1 Sintaxe
getThreadPoolUserExitOnSelect()
5.4.54.2 Retorno
5.4.54.3 Exemplos
cFuncSelect := oRest:getThreadPoolUserExitOnSelect()
5.4.54.4 Abrangência
01/2020
5.4.55 oRest:getThreadPoolUserExitOnStart
Retorna o valor da chave [OnStart] configurada na sessão definida em [UserExits]. O conteúdo desse valor,
significa o nome da função que será executada no momento que as Threads do serviço REST estiverem
inicializando.
5.4.55.1 Sintaxe
getThreadPoolUserExitOnStart()
5.4.55.2 Retorno
5.4.55.3 Exemplos
cFuncStart := oRest:getThreadPoolUserExitOnStart()
5.4.55.4 Abrangência
01/2020
5.4.56 oRest:getThreadPoolUserExitOnStop
Retorna o valor da chave [OnStop] configurada na sessão definida em [UserExits]. O conteúdo desse valor, significa
o nome da função que será executada no momento que as Threads do serviço REST estiverem finalizando.
5.4.56.1 Sintaxe
getThreadPoolUserExitOnStop()
5.4.56.2 Retorno
5.4.56.3 Exemplos
cFuncStop := oRest:getThreadPoolUserExitOnStop()
5.4.56.4 Abrangência
01/2020
5.4.57 oRest:httpCallEnd
Restaura atributos que controlam o processamento da requisição. Ess método é executado ao final de cada
requisição.
5.4.57.1 Sintaxe
httpCallEnd()
5.4.57.2 Retorno
5.4.57.3 Observações
• Utilize esse método se for codificar uma função de callback para tratamento de exceções. O exemplo
exposto aqui é ilustrativo, veja a configuração de tratamento de erro.
5.4.57.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
Function u_errorRecover()
if (oRest != Nil )
oRest:setStatusCode(nStatusCode)
oRest:setFault("Erro interno capturado pela função de callback de erro do
usuário.")
oRest:httpCallEnd()
endif
Return .T.
5.4.57.5 Abrangência
11/2019
5.4.58 oRest:resetMessageResponse
Responsável por restaurar o valor padrão da resposta para uma string vazia, independente do momento em que
seja utilizado.
5.4.58.1 Sintaxe
resetMessageResponse()
5.4.58.2 Retorno
5.4.58.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/resetMessageResponse
5.4.58.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/resetMessageResponse")
Function u_fResetMessageResponse()
Local cResponse := ""
Local lRet := .F.
lRet := oRest:resetMessageResponse()
if (lRet)
cResponse := '{"resetMessageResponse":"método resetMessageResponse
executado com sucesso"}"
else
cResponse := '{"resetMessageResponse":"Nao foi possivel executar o
método resetMessageResponse"}'
endif
return oRest:setResponse(cResponse)
5.4.58.5 Abrangência
11/2019
5.4.59 oRest:resetResponse
Responsável por restaurar o valor padrão do código de status 200200 e da mensagem de resposta para uma string
vazia, independente do momento em que seja utilizado.
5.4.59.1 Sintaxe
resetResponse()
5.4.59.2 Retorno
5.4.59.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/resetResponse
5.4.59.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/resetResponse")
Function u_fResetResponse()
Local cResponse := ""
Local lRet := .F.
lRet := oRest:resetResponse()
if (lRet)
cResponse := '{"resetResponse":"método resetResponse executado com
sucesso"}"
else
cResponse := '{"resetResponse":"Nao foi possivel executar o método
resetResponse"}'
endif
return oRest:setResponse(cResponse)
5.4.59.5 Abrangência
11/2019
5.4.60 oRest:resetStatusCode
Responsável por restaurar os valores padrões para o Status Code (do servidor e do usuário), independente do
momento em que seja utilizado.
5.4.60.1 Sintaxe
resetStatusCode()
5.4.60.2 Retorno
5.4.60.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/resetStatusCode
5.4.60.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/resetStatusCode")
Function u_fResetStatusCode()
Local cResponse := ""
Local lRet := .F.
cResponse := '['
lRet := oRest:setStatusCode(400)
if (lRet)
cResponse += '{"setStatusCode":"método setStatusCode executado com
sucesso"}'
else
cResponse += '{"setStatusCode":"Nao foi possivel executar o método
setStatusCode"}'
endif
lRet := oRest:resetResponse()
if (lRet)
cResponse += ',{"resetStatusCode":"método resetResponse executado com
sucesso"}"
else
cResponse += ',{"resetStatusCode":"Nao foi possivel executar o método
resetStatusCode"}'
endif
cResponse += ']'
return oRest:setResponse(cResponse)
5.4.60.5 Abrangência
11/2019
5.4.61 oRest:sendZipped
Responsável definir que o conteúdo seria enviado compactado ("zipado")
5.4.61.1 Sintaxe
sendZipped( < cKey > )
5.4.61.2 Parâmetros
5.4.61.3 Retorno
5.4.61.4 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/sendZipped e /
documentation/sendZippedCompress
5.4.61.5 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
//Exemplo 1
@Get("/documentation/sendZipped")
Function u_fSendZippedGzip()
Local aZipped := {}
Local cResponse := ""
Local lRet := .F.
Aadd(aZipped, "GZIP")
lRet := oRest:sendZipped(aZipped)
if (lRet)
cResponse := '{"sendZipped": "método sendZipped executado com sucesso"}'
else
cResponse := '{"sendZipped": "método sendZipped nao foi executado"}'
endif
return oRest:setResponse(cResponse)
//Exemplo 2
@Get("/documentation/sendZippedCompress")
Function u_fSendZippedCompress()
Local aZipped := {}
Local cResponse := ""
Local lRet := .F.
Aadd(aZipped, "COMPRESS")
lRet := oRest:sendZipped(aZipped)
if (lRet)
cResponse := '{"sendZipped": "método sendZipped executado com sucesso"}'
else
cResponse := '{"sendZipped": "método sendZipped nao foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.61.6 Abrangência
02/2020
5.4.62 oRest:setCloseAfterSend
Responsável por definir o encerramento da sessão após a requisição
5.4.62.1 Sintaxe
setCloseAfterSend( < lSet > )
5.4.62.2 Parâmetros
5.4.62.3 Retorno
5.4.62.4 Observações
• Para visualizar o exemplo, prepare a requisição com o 'Connection' do header definido como "keep-alive" e
execute seu serviço rest com a URI: /documentation/setCloseAfterSend
5.4.62.5 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/setCloseAfterSend")
Function u_fSetCloseAfterSend()
Local cResponse := ""
Local lRet := ""
5.4.62.6 Abrangência
06/2020
5.4.63 oRest:setFault
Responsável por customizar a mensagem de retorno padrão do servidor rest, ou seja, é possível determinar qual
será a resposta final da requisição em relação a resposta original.
5.4.63.1 Sintaxe
setFault( < cMessage > )
5.4.63.2 Parâmetros
5.4.63.3 Retorno
5.4.63.4 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/setFault
5.4.63.5 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/setFault")
Function u_fSetFault()
Local cResponse := ""
Local lRet := ""
5.4.63.6 Abrangência
12/2019
5.4.64 oRest:setHeaderResponse
5.4.64.1 Rest:setHeaderResponse
Responsável por definir o cabeçalho de resposta. É um cabeçalho HTTP utilizado para fornecer um contexto mais
detalhado da resposta.
Sintaxe
setHeaderResponse( < jValue > )
Parâmetros
Retorno
Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/setHeaderResponse
Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/setHeaderResponse")
Function u_fSetHeaderResponse()
local cJson := '{"Content-Encoding":"gzip","Content-Type":"text/html;
charset=utf-8","Content-Length":"300"}'
local cResponse := ""
local jHeaders
local jRet
local uRet := .F.
jHeaders := JsonObject():New()
uRet := jHeaders:fromJson(cJson)
if (valtype(uRet) == 'U')
jRet := oRest:setHeaderResponse(jHeaders)
if (valtype(jRet) == 'J')
cResponse := '{"setHeaderResponse":"' + jRet:toJson() + '"}'
else
cResponse := '{"setHeaderResponse": "metodo setHeaderResponse nao foi
executado"}'
endif
else
cResponse := '{"setHeaderResponse": "metodo setHeaderResponse nao executado
devido a problema com JSON"}'
endif
return oRest:setResponse(cResponse)
Abrangência
11/2019
5.4.65 oRest:setHttpEnd
Responsável indicar um encerramento forçado da thread
5.4.65.1 Sintaxe
setHttpEnd()
5.4.65.2 Retorno
5.4.65.3 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/setHttpEnd
5.4.65.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/setHttpEnd")
Function u_fsetHttpEnd()
Local cResponse := ""
Local lRet := .F.
lRet := oRest:setHttpEnd()
if (lRet)
cResponse := '{"setHttpEnd": "método setHttpEnd executado com sucesso"}'
else
cResponse := '{"setHttpEnd": "O método setHttpEnd não foi executado"}'
endif
return oRest:setResponse(cResponse)
5.4.65.5 Abrangência
11/2019
5.4.66 oRest:setKeyHeaderResponse
Define o valor de uma chave do cabeçalho de resposta
5.4.66.1 Sintaxe
setKeyHeaderResponse( < cKey >, < cValue > )
5.4.66.2 Parâmetros
5.4.66.3 Retorno
5.4.66.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
// http://localhost:9090/api/testSetKeyHeaderRespose
@Get("testSetKeyHeaderRespose")
Function u_setKeyHeaderResponseExample()
5.4.66.5 Abrangência
11/2019
5.4.67 oRest:setResponse
Responsável por inserir o conteúdo do corpo da mensagem na resposta da requisição HTTP. É possível executar
mais de uma vez esse método, mas é importante saber que, a cada execução o conteúdo recebido no parâmetro
será concatenado.
5.4.67.1 Sintaxe
setResponse( [ cMessage ] )
5.4.67.2 Parâmetros
5.4.67.3 Retorno
5.4.67.4 Observações
• *Este parâmetro pode ser de qualquer tipo, caso seja recebido algum valor diferente de nulo/nil o mesmo
será enviado respeitando os tipos permitidos nas regras de resposta de requisições HTTP. Caso não seja
recebido nada ou um valor nulo, não será inserido nada na resposta da requisição. Para visualizar o
exemplo, execute seu serviço rest com a URI: /documentation/setResponse
5.4.67.5 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/setResponse")
function u_fSetResponse()
local cResponse := ""
local lRet := ""
5.4.67.6 Abrangência
07/2019
5.4.68 oRest:setStatusCode
Responsável por customizar o código de retorno padrão do servidor rest, ou seja, é possível determinar qual será o
status da resposta final da requisição em relação a resposta original.
5.4.68.1 Sintaxe
setStatusCode( < nCode > )
5.4.68.2 Parâmetros
5.4.68.3 Retorno
5.4.68.4 Observações
• Para visualizar o exemplo, execute seu serviço rest com a URI: /documentation/setStatusCode
5.4.68.5 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/setStatusCode")
Function u_fSetStatusCode()
Local cResponse := ""
Local lRet := ""
lRet := oRest:setStatusCode(350)
if (lRet)
cResponse := '{"setStatusCode": "método setStatusCode executado com
sucesso"}'
else
5.4.68.6 Abrangência
08/2019
5.4.69 oRest:updateKeyHeaderResponse
Permite que o usuário dê manutenção em um valor de determinada chave do cabeçalho de repsosta (Header
Response).
5.4.69.1 Sintaxe
updateKeyHeaderResponse( < cKey >, < cValue > )
5.4.69.2 Parâmetros
5.4.69.3 Retorno
5.4.69.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
// http://localhost:9090/api/testUpdateKeyHeader
@Get("testUpdateKeyHeader")
Function u_UpdateKeyHeaderExample()
Local lRet := .F.
Local cRet := 'Update realizado com sucesso'
if !lRet
cRet := "Fail"
endif
return oRest:setResponse(cRet)
5.4.69.5 Abrangência
11/2019
5.4.70 Rest:ExistKeyHeaderResponse
Verifica se uma determinada chave, recebida por parâmetro, existe no header do objeto response
5.4.70.1 Sintaxe
5.4.70.2 Parâmetros
5.4.70.3 Retorno
5.4.70.4 Observações
• Para visualizar seu exemplo, execute o REST no seguinte endereço:
5.4.70.5 Exemplos
#include "tlpp-core.th"
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
#include "tlpp-rest.th"
@Get("/documentation/existkeyheaderresponse")
Function u_fexistKeyHeaderResponse()
Local lreturn := .f.
Local cKey := "Content-Type"
5.4.70.6 Abrangência
01/2020
5.4.71 Rest:getBodyResponse
Retorna o Body do ultimo objeto response enviado
5.4.71.1 Sintaxe
getBodyResponse()
5.4.71.2 Retorno
5.4.71.3 Observações
• Para visualizar o exemplo, execute o est no endereço :"/documentation/getBodyResponse"
5.4.71.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getBodyResponse")
Function u_fgetBodyResponse()
Local cResponse := ""
oRest:setResponse( 'test_getBodyResponse' )
cResponse := oRest:getBodyResponse()
oRest:resetResponse()
return oRest:setResponse('{"getBodyResponse":"' + cValToChar(cResponse) + '"}')
5.4.71.5 Abrangência
07/2019
5.4.72 Rest:getFullURLRequest
Retorna a URL da requisição corrente. Esquema ou protocolo://dominio:porta/caminho/recurso15
5.4.72.1 Sintaxe
getFullURLRequest()
5.4.72.2 Retorno
5.4.72.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
// http://localhost:9090/api/minhaURL
@Get("/documentation/getFullURLRequest")
Function u_fGetFullURLRequest()
Local creturn := ""
creturn := oRest:getFullURLRequest()
creturn := "{'URL':" + creturn + "}"
15 protocolo://dominioporta
5.4.72.4 Abrangência
11/2019
5.4.73 Rest:getLentryPointEnvironment
É possível configurar uma função de callback, para que o usuário realize o processamento que julgar necessário, a
ser executada na criação de uma thread destinada ao REST. Esse método retorna um valor verdadeiro caso esse
ponto tenha sido configurado, e falso caso contrário.
5.4.73.1 Sintaxe
getLentryPointEnvironment()
5.4.73.2 Retorno
5.4.73.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/existEntryPoint")
Function u_existEntryPoint()
Local lRet := .F.
lRet := oRest:getLentryPointEnvironment()
if (lRet)
conout("Foi configurado um ponto de função para preparação de ambiente:
" + oRest:getCentryPointEnvironment())
else
conout("Nao foi configurado ponto de função para preparação de ambiente")
endif
return oRest:setResponse(lRet)
5.4.73.4 Abrangência
04/2020
5.4.74 Rest:getLEntryPointError
É possível configurar uma função de callback, para que o usuário customize o tratamento de erros. Esse método
retorna um valor verdadeiro caso esse ponto tenha sido configurado, e falso caso contrário.
5.4.74.1 Sintaxe
getLEntryPointError()
5.4.74.2 Retorno
5.4.74.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/existEntryPointError")
Function u_existEntryPointError()
Local lRet := .F.
lRet := oRest:getLentryPointError()
if (lRet)
conout("Foi configurado um ponto de função para tratamento de erros: " +
oRest:getCentryPointError())
else
conout("Nao foi configurado ponto de função para tratamento de erros.")
endif
return oRest:setResponse(lRet)
5.4.74.4 Abrangência
04/2020
5.4.75 Rest:getThreadPoolAuthorizationOnAuth
Retorna o nome da função responsável por realizar a autenticação do serviço
5.4.75.1 Sintaxe
getThreadPoolAuthorizationOnAuth()
5.4.75.2 Retorno
5.4.75.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get('/documentation/getThreadPoolAuthorizationOnAuth')
Function u_authorizationFunction()
Local cFunc := oRest:getThreadPoolAuthorizationOnAuth()
return
5.4.75.4 Abrangência
05/2020
5.4.76 Rest:getURLRequest
Retorna a URL da requisição corrente, esse nome corresponde a concatenação da location mais o endpoint de cada
serviço.
5.4.76.1 Sintaxe
getURLRequest()
5.4.76.2 Retorno
5.4.76.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getURLRequest")
Function u_fGetURLRequest()
Local creturn := ""
creturn := oRest:getURLRequest()
creturn := "{'URL':" + creturn + "}"
conout(cReturn) // Vai exibir api/minhaURL
oRest:SetResponse(cReturn)
Return
5.4.76.4 Abrangência
11/2019
5.4.77 Rest:getUserExit
Getter para atributo que informa se houve a necessidade de sair forçadamente da thread.
5.4.77.1 Sintaxe
getUserExit()
5.4.77.2 Retorno
lRet lógico Se for verdadeiro indica que houve uma manipulação, através
do método setUserExit.T..T., forçando que a espera por novas
requisições seja encerrada.
5.4.77.3 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/getUserExit")
Function u_fgetUserExit()
Local lRet := .F.
lRet := oRest:setUserExit(.T.)
lRet := oRest:getUserExit()
return oRest:setResponse('{"UserExit": "A próxima requisão não será respondida.
' + cValToChar(lRet) + '"}')
5.4.77.4 Abrangência
04/2020
5.4.78 Rest:getXhrRequest
Indica se requisição possui o objeto XHR(XML Http Request).
5.4.78.1 Sintaxe
getXhrRequest()
5.4.78.2 Retorno
5.4.78.3 Observações
• Para visualizar o exemplo, execute o Rest no endereço "/documentacao/getxhrrequest""/documentacao/
getxhrrequest"
5.4.78.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentacao/getxhrrequest")
Function u_fGetXhrRequest()
Local lRet := oRest:getXhrRequest()
Local cResponse := ""
return oRest:setResponse(cResponse)
5.4.78.5 Abrangência
01/2020
5.4.79 Rest:setUserExit
Setter para atributo utilizado no fluxo de processamento das requisições. Utilize-o se houver a necessidade de
interromper o processamento de novas requisições.
5.4.79.1 Sintaxe
setUserExit( < lSet > )
5.4.79.2 Parâmetros
5.4.79.3 Retorno
5.4.79.4 Exemplos
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/documentation/setUserExit")
Function u_fsetUserExit()
Local lRet := .F.
lRet := oRest:setUserExit(.T.)
return oRest:setResponse('{"UserExit": "A próxima requisão não será respondida.
' + cValToChar(lRet) + '"}')
5.4.79.5 Abrangência
04/2020
5.5.1 Namespace
tlpp.rest
5.5.2 Funções
• wsRestfulStart(see page 169)
5.5.2.1 Abrangência
19.0.0.0
5.5.3 wsRestfulStart
Função responsável pelo tratamento do JSON de configuração e pela subida de serviço REST compatibilizando os
antigos WsRestful já existentes no RPO.
5.5.3.1 Namespace
tlpp.rest
5.5.3.2 Sintaxe
5.5.3.3 Parâmetros
5.5.3.4 Retorno
5.5.3.5 Exemplos
function u_doc_wsRestfulStart()
local nResult := 0
local jo := Nil
local cEnv := getenvserver()
local _Port_ := 40011
local _Charset_ := "UTF-8"
local _Server_ := "HTTP_SRV"
local _Location_ := "HTTP_APP"
local _ContentTypes_ := "APP_CONTENTTYPES"
local _ThreadPool_ := "TP_APP"
// HTTP Config
// -----------
jo := JsonObject():new()
jo['HTTPSERVER'] := JsonObject():new()
jo['HTTPSERVER']['Log'] := .F.
jo['HTTPSERVER']['Charset'] := _Charset_
jo['HTTPSERVER']['Servers'] := {_Server_}
jo['HTTPSERVER']['LoadJSON'] := .F.
jo['HTTPSERVER']['OldUrns'] := .F.
// Server Config
// -------------
jo[_Server_] := JsonObject():new()
jo[_Server_]['HostName'] := "TOTVS_HTTP_SERVER"
jo[_Server_]['Port'] := _Port_
jo[_Server_]['ContentTypes'] := _ContentTypes_
jo[_Server_]['Locations'] := { _Location_ }
// Aplicativo
// ----------
jo[_Location_] := JsonObject():new()
jo[_Location_]['Path'] := '/'
jo[_Location_]['RootPath'] := "root/web"
jo[_Location_]['DefaultPage'] := {"index.html"}
jo[_Location_]['ThreadPool'] := _ThreadPool_
jo[_ThreadPool_] := JsonObject():new()
jo[_ThreadPool_]['Environment'] := cEnv
jo[_ThreadPool_]['MinThreads'] := 1
jo[_ThreadPool_]['MaxThreads'] := 4
jo[_ThreadPool_]['MinFreeThreads'] := 1
jo[_ThreadPool_]['GrowthFactor'] := 1
jo[_ThreadPool_]['InactiveTimeout'] := 30000
jo[_ThreadPool_]['AcceptTimeout'] := 10000
// ContentTypes
// ------------
jo[_ContentTypes_] := JsonObject():new()
jo[_ContentTypes_]['htm'] := "text/html"
jo[_ContentTypes_]['html'] := "text/html"
jo[_ContentTypes_]['js'] := "application/x-javascript"
jo[_ContentTypes_]['css'] := "text/css"
jo[_ContentTypes_]['txt'] := "text/plain"
jo[_ContentTypes_]['json'] := "application/json"
jo[_ContentTypes_]['stm'] := "text/html"
jo[_ContentTypes_]['tsp'] := "text/html"
return nResult
5.5.3.6 Abrangência
19.3.0.6
6 5 - APIs
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Funcionamento
5 - APIs – 172
TOTVSTEC – REST
• USER VALUE - Valor dos campos que foram digitados pelo usuário.
• INI VALUE - Valor dos campos que foram obtidos na leitura das chaves do arquivo Appserver.ini.
• DEFAULT VALUE - Valor default dos campos.(Utilizado caso não haja configuração das chaves no
arquivo Appserver.ini).
A seguir falaremos sobre os campos para termos uma referência sobre cada um deles:
• OnTime Reload Config - Tempo em segundos para releitura das configuracões do REST em cada Thread.
(Minimo 10s/ Máximo 86400s).
• Print Error - Habilita/Desabilita a impressão do Stack do erro(0 - Desabilitado a impressão do Stack
completo/ 1 - Habilitado em modo full).
• Trace Time - Habilita/Desabilita o contador de tempo de execução de cada rotina(Min: 0 Max: 2).
• Log Level - Nível de detalhamento dos logs (Min: 3 Max: 7).
• Log String Size - Tamanho em KB para cada string de log gerada(Min:10 Max:200).
Ao acionar o botão change setings os valores que estão atribuídos aos campos da coluna USER VALUE, caso
estejam preenchidos, são validados e atualizados on-time no momento do click do botão e seus valores atribuídos
as configurações já passando a valer.
Para facilitar no rodapé da tela, existe a notação: The orange border indicates the value used by the application,
que indica os valores que estão sendo utilizados pela aplicação naquele momento.
5 - APIs – 173
TOTVSTEC – REST
A verificação acima não é um item obrigatório, pode ser desconsiderada, mas pode servir de um meio de
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/tlpp/rest/pegalistaapis")
User Function pegaListaApis()
Return
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/tlpp/rest/pegalistaapis")
public method mPegaListaApis()
endclass
5 - APIs – 174
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
return .T.
6.2.2 Funcionamento
Nos exemplos descritos no item anterior, pode ser observado a utilização da função HTTPQuote disponível no
binário do Appserver, a mesma simula o funcionamento de um Client HTTP onde são passados os parâmetros com
os dados para que seja efetuada a consulta a API por meio do método GET, que também é enviado como
parâmetro.
Pode ser observado também que o retorno é sempre um JSON, que no caso dos exemplos, é convertido em
uma String para que seja possível a sua visualização no Console.log do server, porém o retorno deve ser trabalhado
conforme a necessidade de implementação.
5 - APIs – 175
TOTVSTEC – REST
5 - APIs – 176
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
uma Classe.
Também é possivel consumir a API por meio de um programa fonte .TLPP escrevendo uma User Function ou
5 - APIs – 177
TOTVSTEC – REST
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/tlpp/rest/metricasdetempo")
User Function metricasDeTempo()
Return
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/tlpp/rest/metricasdetempo")
public method mmetricasdetempo()
endclass
5 - APIs – 178
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
return .T.
6.3.2 Funcionamento
A API coleta os dados de consumo simulando a execução de cada entryPoint em cada Slave e
no ThreadPool principal, guarda os dados iniciais e ao final efetua as comparações e os cálculos conforme as
configurações do ambiente em que foi executada.
O seu retorno é uma string que foi dinamicamente montada e caso seja salva como um arquivo com
extensão .html pode ser mostrada como uma pagina web.
P.S.: Caso haja algum problema, o retorno obedece o mesmo formato, porém é passada a informação do que
causou o mal funcionamento.
6.4 Monitoramento
6.4.1 Monitoramento
Esta API permite obter via método GET uma listagem com o consumo de memória do Appserver detalhado por itens
tais como: Memória Residente, Memória Ram , Memória Ram Livre, etc.
Com o resultado é possível analisar a "saúde" do server, muito útil para monitorar o ambiente permitindo se
antecipara até a um travamento por conta do consumo elevado de memória.
5 - APIs – 179
TOTVSTEC – REST
/appserver/metrics
/appserver/metrics?all
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/tlpp/rest/servermonitor")
User Function serverMonitor()
5 - APIs – 180
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Local aHeadStr := {}
Local jReturn
Return
Utilizando Classe
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/tlpp/rest/servermonitor")
public method mServerMonitor()
endclass
5 - APIs – 181
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
return .T.
6.4.1.2 Funcionamento
A API coleta os dados diretamente no binário do servidor de aplicação(AppServer), pois como se trata de medições
de consumo de memória não poderia ser diferente.
Seu uso, como demonstrado acima, pode ser feito acessando-a utilizando o endpoint de 3 diferentes formas o que
interfere diretamente no resultado esperado.
• Utilizando o endpoint - appserver/metrics
• O retorno é um arquivo JSON contendo as formas de consulta e os campos disponíveis para filtro.
• Utilizando o endpoint - appserver/metrics?all
• O retorno é um arquivo JSON contendo o resultado do consumo de todas as memórias utilizadas
pelo Appserver.
• Utilizando o endpoint - appserver/metrics?memory_resident
• O retorno é um arquivo JSON contendo o resultado do filtro passado utilizando a
didática QueryString
P.S.: É possível passar mais de um parâmetro para a API concatenando-os seguindo a metodologia QueryString.
6.5 Versão
Esta API permite obter via método GET os valores de versão, build e patch dos principais componentes do
ambiente:
• Appserver
• TLPP
5 - APIs – 182
TOTVSTEC – REST
O retorno da mesma é um arquivo JSON que pode ser utilizado posteriormente da forma que for necessária para a
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
sua aplicação.
A API disponibiliza 3 endpoints para consumo:
• /totvs/environment - O resultado é um arquivo contendo o resultado concatenado de versão, build e patch
referente ao Appserver e a linguagem TLPP.
• /appserver/environment - O resultado é um arquivo contendo o resultado de versão, build e patch
referente ao Appserver.
• /tlpp/environment - O resultado é um arquivo contendo o resultado de versão, build e patch referente a
linguagem TLPP.
Partindo destes princípios, sua utilização pode ser feita requisitando um endereço como este: https://
localhost:5012/rest/
• https - Protocolo definido na configuração do HttpServer para as aplicações REST.
• localhost - Endereço(IP/Nome) do seu servidor de aplicação responsável pelo REST.
• 5012 - Porta configurada no Appserver para o REST.
• /rest - Location definida no Appserver para o REST.
• ** * ** - URI da aplicação(deve ser substituída por um dos três endpoints da aplicação).
Caso executado diretamente no navegador, será mostrado uma página como esta para cada endpoint:
6.5.1.1 /totvs/environment
/appserver/environment
/tlpp/environment
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/tlpp/rest/versionenvironment")
User Function versionEnvironment()
5 - APIs – 183
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Return
#include "tlpp-core.th"
#include "tlpp-rest.th"
@Get("/tlpp/rest/versionenvironment")
public method mVersionEnvironment()
endclass
5 - APIs – 184
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Local aHeadStr := {}
Local jReturn
return .T.
6.5.2 Funcionamento
A API consegue obter esses dados internamente efetuando consultas no binário, desta forma foi possível conseguir
os valores disponibilizados tanto do servidor de aplicação, quanto do repositório para o caso do TLPP.
Seu uso, como demonstrado acima, pode ser feito acessando-a utilizando o endpoint de 3 diferentes formas para
que se consiga o resultado esperado da forma mais simples possível.
5 - APIs – 185
TOTVSTEC – REST
7 6 - Exemplos práticos
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Nós mantemos um projeto público no GitHub da TOTVS com exemplos práticos para facilitar o aprendizado sobre
essa funcionalidade.
Sintam-se convidados a acessar aqui16 os exemplos de REST.
Aproveitem!
Exemplos:
7.1 CRUD
GITHUB → https://github.com/totvs/tlpp-sample-rest/tree/master/server/CRUD
7.2.1 Como migrar um REST em FWREST para uso com Annotation (tlppCore)
Nesse projeto [ migrate-FWrest-2-tlpp ] iremos exemplificar através de códigos fontes em ADVPL e TL++ as duas
formas de criar serviços REST.
A primeiro forma será como se cria um serviço REST utilizando o framework Protheus em ADVPL e a segunda como
se cria o mesmo serviço REST, porém agora utilizando o recurso de Annotation em TL++.
16 https://github.com/totvs/tlpp-sample-rest
7.2.1.1 Características
Dependências técnicas
• FWREST
a. Binário Lobo-Guará
b. Protheus
c. Framework Protheus
d. License Protheus
e. Conhecimento de Classe
• Annotation
1. Binário Lobo-Guará 2. Core TL++ 3. Conhecimento de annotation
GET
POST
PUT
PATCH
DELETE
• Annotation
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
#include "tlpp-core.th"
#include "tlpp-rest.th"
EndPoint
• FWREST
A composição para a definição de endpoints nessa versão é composta em dois elementos no fonte.
O primeiro é propriamente o nome da classe de Restful, sendo:
WSRESTFUL sampleMigrateRestProtheus
A outra parte é complementada através da definição da classe, sendo:
WSMETHOD POST ....... WSSYNTAX "/sampleMigrateRestProtheus/{id}"
Podendo ter alterações pelo comando PATH, ex:
WSMETHOD POST ........ PATH "/v2/sampleMigrateRestProtheus/{id}"
• Annotation
Por esse modo, você pode criar o endpoint sem qualquer relação ao nome da classe ou função que será
executada.
A definição do endpoint é através da propriedade "endpoint" da annotation, porém, como ela é a primeira
propriedade, pode-se simplesmente colocar seu valor sem nomear a propriedade.
O exemplo abaixo é a forma simples de definir um endpoint:
@Get("/sampleMigrateRestTlpp")
Pode-se também, definir os path params como segue abaixo:
@Get("/sampleMigrateRestTlpp/:id")
Também é possível definir uma descrição para o endpoint, ex:
@Get(endpoint="/sampleMigrateRestTlpp",description="descrição do método Get")
if len(::aURLParms) > 0
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
cId := ::aURLParms[1]
endif
porém, não é possível buscar nominalmente o valor, e somente através da ordem que ele é declarado na
URI.
• Annotation
O objeto oRest possui um método específico para retornar somente os parâmetros recebidos via Path
Param, sendo:
jPath := oRest:getPathParamsRequest()
O retorno do método é uma estrutura em Json com todos os parâmetros recebidos via path param, sendo
assim, é possível resgatar o valor do parâmetro acessando seu valor diretamente no Json através do seu
nome.
Veja abaixo:
cId := jPath[ 'id' ]
// Acessa-se diretamente
conout( ::id )
• Annotation
O objeto oRest possui um método específico para retornar somente os parâmetros recebidos via query
string, sendo:
jPath := oRest:getQueryRequest()
O retorno do método é uma estrutura em Json com todos os parâmetros recebidos via query string, sendo
assim, é possível resgatar o valor do parâmetro acessando seu valor diretamente no Json através do seu
nome.
Veja abaixo:
cId := jPath[ 'id' ]
cBody := ::GetContent()
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
• Annotation
cBody := oRest:GetBodyRequest()
Return OK
• FWREST
::SetResponse( cResponse )
• Annotation
oRest:setResponse( cResponse )
Return Error
• FWREST
SetRestFault( nCodeHttp, cMessage )
• Annotation
oRest:setFault( cResponse )
Nesse caso o código HTTP do retorno será 500, caso tenha a necessidade de trocar o código HTTP, utilize
antes o método conforme abaixo:
oRest:setStatusCode( nCodeHttp )
oRest:setFault( cResponse )
7.2.1.3 Exemplos
É importante ressaltar que para simplificar este manual iremos unificar os verbos HTTP "PUT", "POST" e "PATCH",
pois possuem funcionalidades similares no uso em APIs em REST. Porém nos arquivos acima descritos todos os
exemplos estarão presentes.
Exemplo GET
• FWREST
WSRESTFUL sampleMigrateRestProtheus DESCRIPTION "Exemplo de REST framework
Protheus"
END WSRESTFUL
::SetContentType("application/json")
::SetResponse( cData )
Return .T.
• Annotation
@Get("/sampleMigrateRestTlpp")
user function GETsampleMigrateRestTlpp()
jPath := oRest:getQueryRequest()
if ( jPath <> Nil )
cId := jPath[ 'id' ]
if ( valtype(cId) == 'U' )
cId := ''
endif
endif
oRest:setResponse( cData )
return
Exemplo POST
• FWREST
WSRESTFUL sampleMigrateRestProtheus DESCRIPTION "Exemplo de REST framework
Protheus"
WSMETHOD POST DESCRIPTION "método Post" WSSYNTAX "/
sampleMigrateRestProtheus/{id}"
END WSRESTFUL
::SetContentType("application/json")
if len(::aURLParms) > 0
cId := ::aURLParms[1]
endif
cBody := ::GetContent()
jBody := JsonObject():new()
jBody:fromJson( cBody )
jPath := oRest:getPathParamsRequest()
if ( jPath <> Nil )
cId := jPath[ 'id' ]
if ( valtype(cId) == 'U' )
cId := ''
endif
endif
jBody := JsonObject():new()
jBody:fromJson( oRest:GetBodyRequest() )
if ( jBody <> Nil )
if ( !empty(jBody:GetJsonText("cpo1")) )
cData += ', "cpo1" : "' + jBody:GetJsonText("cpo1") + '" '
endif
if ( !empty(jBody:GetJsonText("cpo2")) )
cData += ', "cpo2" : "' + jBody:GetJsonText("cpo2") + '" '
endif
endif
cData += '}'
oRest:setResponse( cData )
return
Exemplo DELETE
• FWREST
Protheus"
WSMETHOD DELETE DESCRIPTION "método Delete" WSSYNTAX "/
sampleMigrateRestProtheus/{id}"
END WSRESTFUL
::SetContentType("application/json")
if len(::aURLParms) > 0
cId := ::aURLParms[1]
endif
::SetResponse( cData )
Return .T.
• Annotation
@Delete("/sampleMigrateRestTlpp/:id")
user function DeletesampleMigrateRestTlpp()
jPath := oRest:getPathParamsRequest()
if ( jPath <> Nil )
cId := jPath[ 'id' ]
if ( valtype(cId) == 'U' )
cId := ''
endif
endif
cData := '{ "METHOD" : "DELETE" , "id" : "' + cId + '" ' + '}'
oRest:setResponse( cData )
return
8 Authentication
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
8.1 oAuth
O REST server possui recurso de ativar a autenticação para as requisições HTTP.
Schemas de Autenticações disponíveis:
• Basic
• oAuth2(see page 197)
8.1.1 Basic
Para a autenticação Basic, é possível também determinar qual função irá fazer a verificação do usuário e senha
enviados pela requisição.
Sendo assim, ao informar o nome da função para o onAuth, o tlppCore irá executar a função do usuário na primeira
ação assim que chegar a requisição.
8.1.2 Configuração
A ativação da autenticação do serviço REST deverá ser feito para cada servidor configurado, ou seja, é possível ter
autenticações diferentes ou até desativadas por servidor.
Porém, não será possível ter autenticações distintas para as Locations e ThreadPool distintas do mesmo servidor,
nesse caso, todos terão a mesma regra de autenticação.
Nota: os trechos que estão ocultos foram substituídos por ... para facilitar a leitura. A configuração completa você
pode consultar aqui17
[HTTPSERVER]
Enable=1
Servers=HTTP_SRV
...
[HTTP_SRV]
tlppdata='{"Authorization":{"scheme":"basic","OnAuth":"onAuthorization"}}'
...
Como a autenticação é um recurso essencialmente da camada tlppCore, sua configuração é feita através da chave
[tlppdata] da sessão do servidor.
Essa chave pode receber duas formas de valores, 1 - string em formato JSON diretamente, ou, 2 - Nome de arquivo
JSON (com path completo ou não), com o conteúdo da configuração.
A segunda forma é útil quando seja necessário um JSON muito extenso, já que as chaves de INIs no appserver
possuem uma limitação na quantidade de caracteres para ser usado.
Para ativar a autenticação, no JSON é preciso informar o modo e a função que será responsável pelas
autenticações, sendo assim, é preciso um JSON conforme o formato a seguir:
{
"Authorization": {
"scheme": "basic",
"OnAuth": "onAuthorization"
17 //tdn.totvs.com/rest_server.md
Authentication – 194
TOTVSTEC – REST
}
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
}
Note que as informações passadas ao REST, estão dentro de uma chave em nó no JSON com o nome
[Authorization], o modo é informado pela chave [scheme] e a função pela chave [OnAuth].
Nota: Necessário informar um nome válido de função e que esteja compilada no RPO correspondente no
Environment do serviço REST, caso contrário, o tlppCore irá gerar um erro logo na subida do servidor e irá
interromper o start, não ficando disponível.
Abaixo, seguem detalhes de como utilizar cada modo de autenticação disponível no REST server.
[1]
Caso não possua a informação ou não esteja no formato correto, o server não atende a requisição e retorna de
imediato com a mensagem:
{"code":401,"detailedMessage":"","message":"Unauthorized"}
E no Header do HTML a seguinte informação:
WWW-Authenticate: Basic realm="Access to REST", charset="ISO-8859-1"
Com esse retorno, o requisitante tem a condição de adequar a requisição e enviá-la com a informação necessária.
[2]
Caso possua a informação e ela esteja com o formato esperado, então o server irá "Decodar" a base64 onde tenha o
usuário:senha para poder realizar o parse da informação.
Após isso, com os dados já separados, é executada a função definida na chave [onAuth], seguindo a seguinte
assinatura de funcionalidade .
8.1.3.1 Parâmetros
A função customizada recebe 2 (dois) parâmetros, sendo:
1 - cUser
Usuário a ser validado
Authentication – 195
TOTVSTEC – REST
2 - cPass
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
8.1.3.2 Retorno
O retorno é do tipo lógico [boolean], sendo .T. (true) para autenticação com sucesso ou .F. (false) para falha na
autenticação.
Como o tipo retorno deve ser booleano, o server tem uma proteção para quando a função retorne algo diferente do
exigido e irá converter o retorno para booleano, porém para esses casos sempre irá considerar o valor como FALSE.
Sendo assim, o comportamento do REST fica:
Importante ressaltar que, existindo essa função e o valor considerado for FALSE, será considerado como falha de
autenticação.
8.1.3.3 Exemplo
function onAuthorization( cUser, cPass )
return lRet
Caso o retorno seja .F., ou o server considere o retorno inválido, o server não atende a requisição e retorna de
imediato com a mensagem:
Authentication – 196
TOTVSTEC – REST
{"code":403,"detailedMessage":"","message":"Forbidden"}
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Caso o retorno seja .T., o server segue com o atendimento normalmente à requisição, pois considera que o
requisitante tem as credenciais necessárias para executar o serviço.
8.2 oAuth2
Abrangência
Disponível a partir da versão 19.3.1 e superiores.
OAuth 2 é um protocolo de autorização que permite que uma aplicação se autentique em outra. Para que isso
aconteça, uma aplicação pede permissão de acesso para um usuário, sem que para isso ela tenha acesso a alguma
senha dele.
Provavelmente você já clicou em algum botão escrito “Logar com sua conta do Google” ou “Logar com sua conta do
Facebook” quando você está em alguma outra aplicação, para evitar de ter que fazer na mão algum cadastro. Neste
caso, você está dando a autorização de uma aplicação terceira a usar os recursos da sua aplicação, neste caso o
Google ou o Facebook. Essas aplicações têm acesso limitado às informações de usuários através do protocolo
HTTP18. OAuth 2 é utilizado nos mais diversos tipos de autenticação, como em telas de login e na autenticação de
APIs (Application Programming Interface)19.
18 https://www.treinaweb.com.br/blog/o-que-e-http-request-get-post-response-200-404/
19 https://www.treinaweb.com.br/blog/o-que-e-uma-api/
Authentication – 197
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
A implementação do oAuth2 no TlppCore, apesar de ainda não estar contemplando todas as possibilidades de
validação e acesso disponibilizadas pelo protocolo, ocorreu respeitando a RFC674920 .
Foi implementado, até então, o modelo de utilização abaixo:
• Grant Type -> Client Credentials(Password Grant)
Neste modelo, a partir dos dados do cliente(nome, senha) , juntamente com os dados da aplicação(secret, clientId)
são gerados os tokens access/refresh seguindo o formato de utilização(BEARER).
Apesar do envio de usuário e senha, nesta implementação estes dados não ficam de posse da aplicação de
validação(Server), são descartados após a geração dos tokens ficando a cargo da aplicação Client a guarda e o
envio das mesmas, seja através dos EntryPoints disponibilizados ou dos parâmetros da requisição.
Abrangência
Disponível a partir da versão 19.3.0 e superiores.
Quando é solicitada uma requisição para alguma API em um endereço com o protocolo oAuth2 habilitado, é feita a
validação do Token de Acesso(see page 199) e caso o acesso seja negado por conta do access_token estar expirado,
como no exemplo abaixo :
Deve ser feita uma nova requisição a mesma API TlppCore(“/tlpp/oauth2/token”) utilizando o Refresh Token :
https://localhost:1234/tlpp/oauth2/token?refresh_token=7-oP9sZyBG4Vd-Dd_fS5Yz2l.-
Oky8dNxMSgHXv205_nJNCCSwYhdPk8_kI2zDxz9-
20 https://tools.ietf.org/html/rfc6749
Authentication – 198
TOTVSTEC – REST
Ui9Rjj4C0plPV0qPuA6SIlT6Ho2CBDy0TtiwnwzYUvF7XxNHfW3li8GNHCoGND6L03Bq_U0QIaUmurVng.Reqoqn-
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
MXkDnsq3zyboJq4AYB3pSgfS5D5v5wQVJAqU&grant_type=refresh_token21
Caso seja válido o Refresh Token enviado na requisição, o retorno será um novo Token de Acesso(see page 199) como
resposta desta solicitação :
{
"access_token":
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3THBQQzByMyIsInN1YiI6ImVnaWRpbyIsImlhdCI6MTYwODU1OTY5OSwid
XNlcmlkIjoiN0xwUEMwcjMiLCJleHAiOjE2MDg1NjMyOTl9.Lk3_pCqMboiYWqU12_IyVH9qEVXw6VYT2o3RinpGbJo",
"refresh_token": "7-oP9sZyBG4Vd-Dd_fS5Yz2l.-Oky8dNxMSgHXv205_nJNCCSwYhdPk8_kI2zDxz9-
Ui9Rjj4C0plPV0qPuA6SIlT6Ho2CBDy0TtiwnwzYUvF7XxNHfW3li8GNHCoGND6L03Bq_U0QIaUmurVng.Reqoqn-
MXkDnsq3zyboJq4AYB3pSgfS5D5v5wQVJAqU",
"scope": "default",
"token_type": "Bearer",
"expires_in": 3600
}
Abrangência
Disponível a partir da versão 19.3.1 e superiores.
21 https://localhost:1234/rest/tlpp/oauth2/token?grant_type=password&username=nome
Authentication – 199
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
No oAuth2(see page 197) o acesso do cliente a uma API é feito mediante a uma autorização, um token enviado no
header da requisição.
Esse código de acesso ou Access Token é gerado previamente por um servidor de autorização(Authorization Server)
determinado pelo dono da aplicação(Resource Owner).
Para obter o token o cliente deve fazer uma chamada Http POST a API TlppCore através do endereço “/tlpp/
oauth2/token” desta forma :
https://localhost:1234/tlpp/oauth2/token?
grant_type=password&username=nome22dousuario&password=senhadousuario
Onde desmembrando a URL temos:
• https:// : Protocolo preferencial para utilização deste endpoint com utilização de SSL.
• localhost:1234 : Endereço e porta do seu servidor onde o oAuth2(see page 197) está configurado.
• /tlpp/oauth2/token? : endpoint padrão TlppCore para obtenção de tokens.
• grant_type : "password"(enviar a palavra password)
• username - nome do usuário(nome do usuário que está solicitando acesso a aplicação).
• password - senha do usuário(senha do usuário que está solicitando acesso a aplicação).
{
"access_token":
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3THBQQzByMyIsInN1YiI6ImVnaWRpbyIsImlhdCI6MTYwODU1OTY5OSwid
XNlcmlkIjoiN0xwUEMwcjMiLCJleHAiOjE2MDg1NjMyOTl9.Lk3_pCqMboiYWqU12_IyVH9qEVXw6VYT2o3RinpGbJo",
"refresh_token": "7-oP9sZyBG4Vd-Dd_fS5Yz2l.-Oky8dNxMSgHXv205_nJNCCSwYhdPk8_kI2zDxz9-
Ui9Rjj4C0plPV0qPuA6SIlT6Ho2CBDy0TtiwnwzYUvF7XxNHfW3li8GNHCoGND6L03Bq_U0QIaUmurVng.Reqoqn-
MXkDnsq3zyboJq4AYB3pSgfS5D5v5wQVJAqU",
"scope": "default",
"token_type": "Bearer",
22 https://localhost:1234/rest/tlpp/oauth2/token?grant_type=password&username=nome
23 http://tdn.totvs.com
24 http://tdn.totvs.com
25 https://tdn.totvs.com/display/tec/Json
Authentication – 200
TOTVSTEC – REST
"expires_in": 3600
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
}
Caso haja falha em alguma das validações prévias a geração do token, é enviado ao cliente uma resposta contendo
o código de erro constando no corpo da mensagem a descrição da falha:
Abrangência
Disponível a partir da versão 19.3.1 e superiores.
Correção Inportante
Correção de congelamento de novas solicitações após erro na validação do Token de Acesso(see page 199)
disponíveis no TLPP.RPO com data superior a 01/06/2022
Após configurar o ambiente(see page 202) e entender como funciona o Token de Acesso(see page 199) e o Refresh
Token(see page 198) está na hora de utilizar o protocolo oAuth2 (see page 197)para validação de acesso as APIs.
Para isso siga os passos descritos a seguir:
1. Solicitar um Token de Acesso(see page 199) fazendo uma requisição do tipo "POST" para o EndPoint: "/tlpp/
oauth2/token" enviando os parâmetros: grant_type/username/password.
https://localhost:47500/rest/tlpp/oauth2/token?
grant_type=password&username=josemaria&password=123456abc26
2. Caso todas as configurações tenham sido efetuadas com sucesso, o retorno da requisição acima trará o
Token de Acesso(access_token)(see page 199) que deve ser utilizado para acesso a API desejada.
Para isso no momento da solicitação, o token deve ser enviado no header da requisição desta forma:
Accept: application/json
Authorization: Bearer
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJUT1RWUy1BRFZQTC1GV0pXVCIsIn
N1YiI6Im1hcmlvIiwiaWF0IjoxNTUzMDIyMjYwLCJleHAiOjE1NTMwMjU4NjAsInJlc3RyaWN0Z
WR0byI6WyJhcGkvcHJvdGhldXMvIiwiYXBpL2ZyYW1ld29yay8iXX0.jgvejFxPYDchLtj04r7m
i
26 https://localhost:47500/rest/tlpp/oauth2/token?grant_type=password&username=egidio&password=e1g2d3i4o5
Authentication – 201
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
3. Se no item anterior o retorno da requisição for "token expired", é hora da utilização do Refresh Token(see page
198).
Para isto deve ser efetuada uma requisição do tipo "POST" para o EndPoint: "/tlpp/oauth2/token" enviando
os parâmetros: refresh_token/grant_type.
https://localhost:47500/rest/tlpp/oauth2/token?refresh_token=7-oP9sZyBG4VZ-yR_9K5Yz2l.-
Oky8dNxMSgHXv205_nJNCCSwYhdPk8_kI2zDxz9-Uy-
RAbeC0hbE10qPuA6SIlT6Ho2CBDy0TtiwnwzYUOJ70JrHfeJuC8GNHCoGND6L03Bq_U0QIaUmurVng.B_CLxM
apc9laad5uyx5aMZ7xDDXnS0NqrNqoraDnrEE&grant_type=refresh_token
4. Estando o refresh token (see page 198)íntegro e não expirado, o retorno da solicitação trará uma resposta
idêntica a do item 1, com um novo access_token(see page 199).
Se o refresh token(see page 198) enviado estiver vencido(expirado)(see page 205) deve-se refazer os
procedimentos seguindo os passos desde o primeiro item desta lista para obtenção de um novo Token de
acesso.
Abrangência
Disponível a partir da versão 19.3.1 e superiores.
27 https://tdn.totvs.com/download/attachments/342309536/appserver.ini?api=v2&modificationDate=1520349518000&version=1
Authentication – 202
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
[HTTPS_OAUTH2_47500_TLPPCORE]
hostname=localhost
port=47500
locations=HTTPS_ROOT_OAUTH2_47500
ContentTypes=CT_HTPP
SslCertificate=_certs\cloud_cert_with_no_chain.pem
SslCertificateKey=_certs\cloud_key.pem
Charset=UTF-8
tlppdata={"Authorization":{"scheme":"oAuth2","onAuth":"", "onAuthNoCheckUri":"resource_oAuth2NoCheckUri",
"onAuthparams":"oAuth2GetParameters"}}
A chave tlppdata é onde devem ser configuradas as funções necessárias para o correto funcionamento do oAuth2
TlppCore.
Ela possui o formato Json28, portanto sua sintaxe deve seguir o modelo de {“key”:”value”} caso contrário, os
valores não serão lidos e será apontado erro de configuração no momento da requisição ou na validação dos
tokens.
Abaixo veremos o detalhamento de cada uma das chaves e seus respectivos valores:
• "Authorization" -> Indica que nesta porta há um protocolo de autorização. A partir do momento que esta
key foi declarada o server exigirá as demais chaves.
• "scheme" -> Deve ser declarado o protocolo de autorização no caso : "oAuth2(see page 197)". Este parâmetro é
obrigatório, não pode ser deixado em branco/null e caso seja colocado um valor diferente de "oAuth2" ou
"oAuth(see page 203)", será apresentado erro na utilização do endpoint.
• "onAuth(see page 203)" -> Inserir o nome da função que irá realizar a checagem do token assim que chegar a
requisição a uma API. Caso seu valor seja declarada : "" (em branco) será utilizada a função padrão TlppCore
para validação do access token .
• "onAuthNoCheckUri(see page 204)" -> Declarar a função responsável por incluir a lista com os endpoints
que não devem ser validados pelo oAuth2. Caso seja declarada : "" (em branco) todos os endpoints exigirão
o access token e serão validados.
• "onAuthparams(see page 205)" -> Declarar a função responsável por enviar os parâmetros privados do cliente
para composição e validação dos tokens(access/refresh). O valor desta chave é obrigatório, não pode ser
deixado em branco/null.
Observação
É ALTAMENTE recomendado o uso de uma porta HTTPS com protocolo SSL por conta da segurança no
tráfego de informações, evitando inclusive ataques do tipo: man-in-the-midle(MITM)29
8.3.1 onAuth
Abrangência
Disponível a partir da versão 19.3.1 e superiores
28 https://tdn.totvs.com/display/tec/Json
29 https://www.treinaweb.com.br/blog/termos-comuns-de-seguranca-man-in-the-middle/
Authentication – 203
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
No valor desta chave do tlppData, deve ser declarada a função que será a responsável por validar o access token
enviado nas requisições feitas ao servidor. Ela pode ter o seu valor ""(em branco) deixando a validação para a
função padrão do TlppCore, mas se caso for incluso um valor, esta função deve estar devidamente compilada no
environment pois passará a responder pelas validações de acesso as API's.
Após a lógica de validação do token recebido, a função deve devolver um parâmetro de retorno:
lRet Boolean .T. caso o token esteja válido / .F. se o token não
estiver valido
Exemplo de aplicação:
Função de validação
8.3.2 onAuthNoCheckUri
Abrangência
Disponível a partir da versão 19.3.1 e superiores
O valor desta key no tlppdata, quando declarado, informa que existe uma função que informará ao sistema que
existem URI's que não devem ser validadas quando o protocolo oAuth2 estiver ativado.
Authentication – 204
TOTVSTEC – REST
Se o valor desta chave não for declarada, todas as requisições passarão pela função de validação de access tokens
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
Exemplo de aplicação:
8.3.3 onAuthparams
Abrangência
Disponível a partir da versão 19.3.1 e superiores.
8.3.3.1 Definição
Essa função tem a responsabilidade de carregar as propriedades que serão utilizadas posteriormente tanto na
geração dos tokens(access/refresh), quanto na validação do acesso, sendo a sua declaração e existência da
função responsável obrigatória.
Authentication – 205
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
• No endpoint responsável pela solicitação dos tokens, os parâmetros username e password devem sempre
ser informados no momento da requisição, pois são necessários para a composição do acess token e refresh
token.
• Neste EntryPoint devem ser implementadas todas as lógicas de validação dos parâmetros enviados na
requisição, no caso em específico: username e password. em como como quando não houver.
• O TlppCore disponibiliza um parâmetro inicial que é passado por referência, 30 nele se encontram os
valores dos parâmetros que foram passados na URI de solicitação de token para que a função possa fazer o
trabalho necessário de armazenamento e validação das informações:
Parâmetro Tipo Descrição Obrigatório
8.3.3.3 Observações
• Pelo fato de o TlppCore ser um framework independente do produto, optamos por não guardar essas
informações em nossa camada, portanto esse EntryPoint é de total responsabilidade do utilizador, bem
como a sua lógica.
• É imprescindível que as propriedades possuam os mesmos nomes e tipos conforme informado no quadro
do tópico acima: Informações importantes.
• Quando é recebida uma solicitação de acesso, o fluxo de validação passará por este EntryPoint, deve-se
ficar atento para o desenvolvimento desta rotina, uma vez que todas as propriedades devem ser carregadas
para que o token recebido seja válido.
30 http://www.blacktdn.com.br/2009/01/protheus-programao-bsica-em-advpl-combo_8098.html
31 https://tdn.totvs.com/display/tec/Classe+JsonObject
Authentication – 206
TOTVSTEC – REST
You are using an UNLICENSED copy of Scroll PDF Exporter for Confluence. Do you find Scroll PDF Exporter useful? Consider purchasing it today: https://www.k15t.com/software/scroll-pdf-exporter
8.3.3.4 Utilização
Exemplo de aplicação com apenas 1 usuário fixo e propriedades carregadas a partir das #define:
Função de Parametrização
Return
Authentication – 207