Páginas filhas
  • Desenvolvimento de APIs para o produto Logix

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

     O desenvolvimento de APIs permite a exposição e o consumo de dados com o objetivo da para integração (front-end, portais, customizações, etc) ao com o back-end do produto Logix, de maneira segura e padronizada. A

     A estrutura de integração de APIs Logix suporta o envio de requisições no estilo de arquitetura REST com o desenvolvimento da regra de negócio em 4GL . Esta funcionalidade e está disponível para utilização conforme apresentado no quadro abaixo:

...

     Para "publicar" a funcionalidade 4GL basta criar o programa (.4gl) com o seguinte caminho: <módulo>/api/<versão API>/<recurso>.4gl. 

     A sub-pasta "api" passa então a concentrar todas as funcionalidades de integração do módulo em questãodos módulos existentes. Outros caminhos e parâmetros podem ser adicionados a URL, mas sempre de acordo com o Guia de Implementação de APIs.

Informações
titleImportante

Os programas 4GL disponibilizados, deverão seguir o padrão de localização abaixo:

Exemplos:

Objeto de NegócioFunção de roteamento
\suprimentos\obrigacoes_fiscais\api\v1\transportadoras.4globf_v1_transportadoras
\suprimentos\suprimentos\api\v1\estoque.4glsup_v1_estoque
\adm_producao\manufatura\api\v1\apontamento_horas.4glman_v1_apontamento_horas
Nota
titleImportante

Para desenvolvimentos específicos , adicionar um indicador é preciso adicionar o sufixo "_espec" ao nome do recurso "_espec" para que não gere conflitos com as APIs padrões disponibilizadas pelo produto padrão.

Exemplo: obf_v1_transportadoras_espec.4gl


       Dentro do programa 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:

...

Bloco de código
languageerl
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_get_dimensoes_normal")  #--# Função a ser executada #--#
 	                                  
    CALL _ADVPL_add_rest_logix_routes("GET",                           
 	                                  "/*",                            
 	                                  "order=dimensao",                
 	                                  "wms_v1_get_dimensoes_ordenado")  
 	
 	CALL _ADVPL_add_rest_logix_routes("GET",                          
 	                                  "/*",                           
 	                                  "",                             
 	                                  "wms_v1_get_dimensoes")        
 	                             
 	CALL _ADVPL_add_rest_logix_routes("POST",                        
 	                                  "/*",                         
 	                                  "",                           
 	                                  "wms_v1_update_dimensoes")       
 	                                  
 	CALL _ADVPL_add_rest_logix_routes("PUT",                           
 	                                  "/*",                            
 	                                  "",                             
 	                                  "wms_v1_update_parc_dimensoes")  
 	                                  
    CALL _ADVPL_add_rest_logix_routes("DELETE",                       
 	                                  "/*",                          
 	                                  "",                            
 	                                  "wms_v1_delete_dimensoes")   
 
END FUNCTION


#------------------------------------------------------#
 FUNCTION wms_v1_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_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:

...

Informações

Algumas considerações sobre o uso de roteamento através da função _ADVPL_add_rest_logix_routes():

  • Os roteamentos devem ser definidos sempre do mais específico (detalhado) para o mais genérico (simples).
  • O Logix REST utiliza a função Match() do ADVPL, que basicamente permite o uso do sinal "?" (interrogação) como coringa para uma determinada posição e o sinal "*" (asterisco) para um conjunto de caracteres variáveis. Para mais detalhes acesse a documentação da função Match().
  • Podem ser definidos um ou mais parâmetros de pesquisa utilizando a "," (vírgula) como separador e a pesquisa sempre será realizada utilizando o operador AND.

Formato mensagem JSON

  • Exemplo:
    CALL _ADVPL_add_rest_logix_routes("GET",                           
     	                              "/*",                            
     	                              "order=dimensao,cliente=*",                
     	                              "wms_v1_get_dimensoes_ordenado")

    Veja que o parâmetro QUERY foi repassado como "order=dimensao,cliente=*" onde existem 2 filtros separados por uma vírgula, sendo:

FILTRO 1: order=dimensao

FILTRO 2: cliente=*

  • Atente aos valores repassados como QUERY e PATH pois são processados como CaseSensitve.

Formato mensagem JSON

...

      A varíavel de referência de um objeto LJSONOBJECT,       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.

...

Trata a criação do JSON de response da requisição.

Acesse a documentação referente ao componente Logix LRESTLOGIXRESPONSE para saber mais detalhes a respeito das propriedades SET e GET disponíveis.


Exemplos de utilização

Bloco de código
languageerl
titleCriação de Response
#----------------------------------------------#
 FUNCTION wms_v1_get_dimensao(l_json_reference)
#----------------------------------------------#
	DEFINE l_json_reference VARCHAR(10)
    DEFINE l_logix_response VARCHAR(10)
	DEFINE l_json CHAR(1000)
	
    #--# Utilização do método SERIALIZE da classe LJSONOBJECT  #--#
	LET l_json = _ADVPL_get_property(l_json_reference,"SERIALIZE")
	
	#--# Criação da resposta padronizada utilizando a classe LRestLogixResponse  #--#
	LET l_logix_response = _ADVPL_create_component(NULL,"LRestLogixResponse")
    CALL _ADVPL_set_property(l_logix_response,"PAYLOAD",l_json,"payload")

	#--# Propriedades opcionais #--#
    CALL _ADVPL_set_property(l_logix_response,"MESSAGE","Erro Msg","Erro Detail", "10")
    CALL _ADVPL_set_property(l_logix_response,"STATUS",'200',"status")

	#--# Opcional, utilizada quando o conteúdo de retorno for um JSONArray #--#
	CALL _ADVPL_set_property(l_logix_response,"HAS_NEXT",TRUE)
    
	RETURN _ADVPL_get_property(l_logix_response,"GENERATE")
END FUNCTION

...

Bloco de código
languageerl
titleCarregar QueryParam e PathParam
#--------------------------------------------------#
 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: '{"queryParam1":["codigo","valor"]}'
	LET l_query_param = _ADVPL_get_property(l_json_reference,"VALUE","queryparams[1][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),'"}'
	
	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',"status")
    
	RETURN _ADVPL_get_property(l_logix_response,"GENERATE")

END FUNCTION