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 programa 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 |
---|
Exemplo de definição de funções funçõe756pxs 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() #------------------------------# 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_dimensoes_normal") #--# Função a ser executada #--# CALL _ADVPL_add_rest_logix_routes("GET", "/*", "order=dimensao", "wms_v1_dimensoes_get_dimensoes_ordenado") CALL _ADVPL_add_rest_logix_routes("GET", "/*", "", "wms_v1_dimensoes_get_dimensoes") CALL _ADVPL_add_rest_logix_routes("POST", "/*", "", "wms_v1_updatedimensoes_dimensoespost") CALL _ADVPL_add_rest_logix_routes("PUT", "/*", "", "wms_v1_updatedimensoes_parc_dimensoesput") CALL _ADVPL_add_rest_logix_routes("DELETE", "/*", "", "wms_v1_dimensoes_delete_dimensoes") END FUNCTION #------------------------------------------------------# FUNCTION wms_v1_dimensoes_get_dimensoes_normal(l_json_reference) #------------------------------------------------------# DEFINE l_json_reference VARCHAR(10) DEFINE l_json VARCHAR(1000) . . . RETURN l_json END FUNCTION #-------------------------------------------------------# FUNCTION wms_v1_dimensoes_get_dimensoes_ordenado(l_json_reference) #-------------------------------------------------------# 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() |
...
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 Informacao Após configuração do usuário Logix e/ou Empresa na seção [WEBSERVICES], conforme mencionado acima, reinicie o AppServer para que a nova configuração seja levada em consideração nas requisições REST e WebServices no Logix. Titulo IMPORTANTE!
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>
|