Histórico da Página
Informações | ||||
---|---|---|---|---|
| ||||
|
01. Introdução
O desenvolvimento de APIs permite a exposição e o consumo de dados para integração (front-end, portais, customizações, etc) com o back-end do produto Logix, de maneira segura e padronizada.
...
Informações | ||||||
---|---|---|---|---|---|---|
| ||||||
|
02. Formato URL
O Guia de Implementação de API TOTVS define que o formato das URIs dos endpoints devem conter o nome do produto, o módulo, a versão da API e o recurso alvo da funcionalidade em questão. Tomando como exemplo o endpoint de integração do recurso de "Dimensões" do módulo de "WMS" do produto "Logix", a URI básica deste serviço deve ser: /api/wms/v1/dimensoes
...
Aviso |
---|
A URL definida pelo Padrão de API TOTVS segue o seguinte formato: /api/<módulo>/<versão API>/<recurso>/ Informações que forem passadas após o recurso, serão tratadas como parâmetros PATH. |
03. Serviços 4GL
Para "publicar" a funcionalidade 4GL basta criar o programa (.4gl) com o seguinte caminho: <módulo>/api/<versão API>/<recurso>.4gl.
...
Informações | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||
Os programas 4GL disponibilizados, deverão seguir o padrão de localização abaixo: Exemplos:
|
Dentro do código fonte 4GL a definição da função principal (roteadora) é de fundamental importância, pois é ela que será primeiramente chamada e que definirá como será a execução das outras funções com base na requisição solicitada. Segue abaixo um exemplo de definição:
Informações |
---|
04. Exemplo de desenvolvimento em 4GL
Nome das funções
Exemplo de definição de funçõe756pxs funções e como será realizada a requisição web de execução destas funções:
...
Função | Requisição |
---|---|
|
|
FUNCTION sup_v1_estoque() |
|
FUNCTION man_v1_apontamento_horas() |
|
Abaixo um exemplo de recurso desenvolvido em 4GL para ser utilizado junto ao serviço de API:
Bloco de código | ||||
---|---|---|---|---|
| ||||
DATABASE Logix #---------------------------# FUNCTION wms_v1_dimensoes() #---------------------------# {FUNÇÃO PRINCIPAL QUE FAZ DEFINIÇÃO DAS ROTAS} CALL _ADVPL_create_rest_logix_routes() CALL _ADVPL_add_rest_logix_routes("GET", #--# Método #--# "/normal/*/", #--# Path Param a ser filtrado #--# "fields=*", #--# QueryParam a ser filtrado #--# "wms_v1_dimensoes_get_normal") #--# Função a ser executada #--# CALL _ADVPL_add_rest_logix_routes("GET", "/*", "order=dimensao", "wms_v1_dimensoes_get_ordenado") CALL _ADVPL_add_rest_logix_routes("GET", "/*", "", "wms_v1_dimensoes_get") CALL _ADVPL_add_rest_logix_routes("POST", "/*", "", "wms_v1_dimensoes_post") CALL _ADVPL_add_rest_logix_routes("PUT", "/*", "", "wms_v1_dimensoes_put") CALL _ADVPL_add_rest_logix_routes("DELETE", "/*", "", "wms_v1_dimensoes_delete") END FUNCTION #------------------------------------------------------# FUNCTION wms_v1_dimensoes_get_normal(l_json_reference) #------------------------------------------------------# DEFINE l_json_reference VARCHAR(10) DEFINE l_json VARCHAR(1000) {FUNÇÃO GET COM PATH PARAM "NORMAL" ADICIONADA COMO ROTA NA FUNÇÃO wms_v1_dimensoes()} DEFINE l_json_reference VARCHAR(10) DEFINE l_json VARCHAR(1000) . . . RETURN l_json END FUNCTION #-------------------------------------------------------# FUNCTION wms_v1_dimensoes_get_ordenado(l_json_reference) #-------------------------------------------------------# {FUNÇÃO GET COM PATH PARAM "ORDENADO" ADICIONADA COMO ROTA NA FUNÇÃO wms_v1_dimensoes()} DEFINE l_json_reference VARCHAR(10) DEFINE l_json VARCHAR(1000) . . . RETURN l_json END FUNCTION |
No exemplo acima, temos os seguintes pontos:
01. Função Roteadora
Bloco de código | ||
---|---|---|
| ||
FUNCTION wms_v1_dimensoes() |
...
Informações |
---|
Algumas considerações sobre o uso de roteamento através da função _ADVPL_add_rest_logix_routes():
FILTRO 1: order=dimensao FILTRO 2: cliente=*
|
03. Formato
...
Mensagem JSON
A varíavel de referência de um objeto LJSONOBJECT, recebida pela requisição na função 4GL conterá informações completas da requisição, desde informações do HEADER, QUERY PARAMs, PATH PARAMs e o próprio PAYLOAD.
...
Bloco de código | ||
---|---|---|
| ||
{ uri: valor, method: GET, headers: {}, pathParams: [ "param1", "param2" ], queryParams: { query1: valor1, query2: valor1}, payload: {} } |
03. Classes
...
Utilitárias
...
Com o objetivo de facilitar a manipulação dos objetos JsonObject recebidos e enviados pela API 4GL, foram desenvolvidas algumas classes de utilitários:
...
Bloco de código | ||||
---|---|---|---|---|
| ||||
#--------------------------------------------------# FUNCTION vdp_v1_clientes_nacionais(l_json_reference) #--------------------------------------------------# DEFINE l_json_reference VARCHAR(10) DEFINE l_logix_response VARCHAR(10) DEFINE l_query_param CHAR(200) DEFINE l_path_param CHAR(200) DEFINE l_json_retorno CHAR(1000) #--# Carrega o valor da primeira entrada do Query Param #--# #--# Exemplo de QueryParams ?order=dimensao&cliente=1234: '[["order","dimensao"],["cliente","1234"]]' #--# No exemplo abaixo, a busca acontece no primeiro QueryParam (order) buscando o nome dele (order) #--# LET l_query_param = _ADVPL_get_property(l_json_reference,"VALUE","queryparams[1][1]") #--# Neste exemplo, a busca acontece no primeiro QueryParam (order) buscando o valor dele (dimensao) #--# LET l_query_param = _ADVPL_get_property(l_json_reference,"VALUE","queryparams[1][2]") #--# No exemplo abaixo, a busca acontece no segundo QueryParam (cliente) buscando o nome dele (cliente) #--# LET l_query_param = _ADVPL_get_property(l_json_reference,"VALUE","queryparams[2][1]") #--# Neste exemplo, a busca acontece no primeiro QueryParam (cliente) buscando o valor dele (1234) #--# LET l_query_param = _ADVPL_get_property(l_json_reference,"VALUE","queryparams[2][2]") #--# Carrega o primeiro Path Param #--# #--# Exemplo: '{"pathparams":["path1","path2"]}' LET l_path_param = _ADVPL_get_property(l_json_reference,"VALUE","pathparams[1]") LET l_json_retorno = '{"queryParam":"',LOG_alltrim(l_query_param),'","pathParam":"',LOG_alltrim(l_path_param),'"}' #--# Executar a regra de negócio neste ponto #--# LET l_logix_response = _ADVPL_create_component(NULL,"LRestLogixResponse") CALL _ADVPL_set_property(l_logix_response,"PAYLOAD",l_json_retorno,"payload") CALL _ADVPL_set_property(l_logix_response,"STATUS",'200') RETURN _ADVPL_get_property(l_logix_response,"GENERATE") END FUNCTION |
Card documentos | ||||
---|---|---|---|---|
|
Templatedocumentos | ||
---|---|---|
|
HTML |
---|
<style>
div.theme-default .ia-splitter #main {
margin-left: 0px;
}
.ia-fixed-sidebar, .ia-splitter-left {
display: none;
}
#main {
padding-left: 10px;
padding-right: 10px;
overflow-x: hidden;
}
.aui-header-primary .aui-nav, .aui-page-panel {
margin-left: 0px !important;
}
.aui-header-primary .aui-nav {
margin-left: 0px !important;
}
</style>
|