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.

...

Bloco de código
languageruby
themeConfluence
DATABASE Logix

{
Função roteadora principal que será executada pelo Logix REST quando feito 
uma requisição que combine com o módulo, a versão e o recurso da função.
}
#---------------------------#
 FUNCTION wms_v1_dimensoes()
#---------------------------#
{FUNÇÃO PRINCIPAL QUE FAZ DEFINIÇÃO DAS ROTAS}

  	CALL _ADVPL_create_rest_logix_routes()
 	
 	CALL _ADVPL_add  #Inicia a técnica para definição das rotas de execução das funções conforme a requisição recebida.
 	CALL _ADVPL_create_rest_logix_routes("GET",                )
 	
    #Definição de rota onde toda requisição de método GET, que contenha o filtro a seguir,
    #será direcionada #--# Método #--#
 	   para função wms_v1_dimensoes_get_normal().
    #FILTRO:
    # - Serão capturadas todas as requisições que possuírem um parâmetro Path "/normal" 
    #   e um parâmetro Query "fields" com qualquer conteúdo (*). 
 	CALL "/normal/*/",_ADVPL_add_rest_logix_routes("GET",                      #--# Path Param a ser filtradoMétodo #--#
 	                                  "fields=/normal/*/",                 #--# Path QueryParamParam a ser filtrado #--#
 	                                  "wms_v1_dimensoes_get_normal")fields=*",                 #--# FunçãoQueryParam a ser executadafiltrado #--#
 	                                  
    CALL _ADVPL_add_rest_logix_routes("GET",        "wms_v1_dimensoes_get_normal")  #--# Função a ser executada #--#
 	 
    #Definição de outra rota, onde toda requisição de método GET, que contenha o filtro a seguir,
 	   #será direcionada para    função wms_v1_dimensoes_get_ordenado().
    #FILTRO:
    # - Serão capturadas todas requisições que contenha qualquer parâmetro Path ("/*"  indica "Todos Paths"  ou "/*nenhum",) 
    #   e um parâmetro Query "order" com valor "dimensao"
    CALL _ADVPL_add_rest_logix_routes("GET",        
 	                  
 	               "order=dimensao",                
 	  "/*",                                "wms_v1_dimensoes_get_ordenado")  
 	
 	CALL _ADVPL_add_rest_logix_routes("GET",
 	                            
 	     "order=dimensao",                
 	            "/*",                      "wms_v1_dimensoes_get_ordenado")     
 	
    #Definição de outra rota, onde todas as requisições de método GET, que possuírem quaisquer parâmetros 
                "",   #(Query e/ou Path) informados, serão direcionadas para a função wms_v1_dimensoes_get().
 	CALL _ADVPL_add_rest_logix_routes("GET",                          
 	                                  "wms_v1_dimensoes_get")  /*",      
 	                    
 	        
 	CALL _ADVPL_add_rest_logix_routes("POST",                        
 	"",                             
 	    "/*",                         
 	    "wms_v1_dimensoes_get")        
 	                     "",        
    #Definição de rota onde todas as requisições de método POST, que possuírem quaisquer parâmetros (Query 
 	  e/ou Path) informados, 
    #serão direcionadas para a função wms_v1_dimensoes_post().
	CALL _ADVPL_add_rest_logix_routes("POST",                      "wms_v1_dimensoes_post")  
 	    
 	                             "/*",     
 	CALL _ADVPL_add_rest_logix_routes("PUT",                  
 	        
 	                         "",         "/*",                  
 	         
 	                        "wms_v1_dimensoes_post")       
 	  "",                             
 	  
    #Definição de rota onde todas as requisições de método PUT (update), que possuírem quaisquer parâmetros (Query e/ou Path) informados, 
    #serão direcionadas para a função "wms_v1_dimensoes_put"()  .
 	CALL _ADVPL_add_rest_logix_routes("PUT",                           
 	           
    CALL _ADVPL_add_rest_logix_routes("DELETE",                  "/*",     
 	                      
 	           "/*",                       "",   
 	                         
 	        "",                          "wms_v1_dimensoes_put")  
 	                                   "wms_v1_dimensoes_delete")
    
END FUNCTION

#------------------------------------------------------#
 FUNCTION wms_v1_dimensoes_get_normal(l_json_reference)
#------------------------------------------------------#
{FUNÇÃO GET COM PATH PARAM "NORMAL" ADICIONADA COMO ROTA NA FUNÇÃO#Definição de rota onde todas as requisições de método DELETE, que possuírem quaisquer parâmetros (Query e/ou Path) informados, 
    #serão direcionadas para a função wms_v1_dimensoes_delete()}

	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
languageerl
FUNCTION wms_v1_dimensoes()

    É a função roteadora, que será executada pelo Logix REST quando feito uma requisição que combine com o módulo, a versão e o recurso da função.

Bloco de código
languageerl
CALL _ADVPL_create_rest_logix_routes()

    Inicia a técnica para definição das rotas de execução das funções conforme a requisição recebida.

Bloco de código
languageerl
CALL _ADVPL_add_rest_logix_routes("GET", #--# Método #--#
 	.
    CALL _ADVPL_add_rest_logix_routes("DELETE",                       
 	                                  "/*",                          
 	                                  "",                            
 	               "/normal/*/", #--# Path Param #--#
 	              "wms_v1_dimensoes_delete")                "fields=*",   #--# QueryParam #
END FUNCTION

#------------------------------------------------------#
 	                              "wms_v1_get_dimensoes_normal") 

    Neste exemplo está sendo definida uma rota onde toda requisição de método GET, que contenha os filtros informados, será direcionada para função wms_v1_get_dimensao_normal.

Bloco de código
languageerl
"/normal/*/",               #--# Path Param a ser filtrado #--#
"fields=*",                 #--# QueryParam a ser filtrado #--#

    Em relação ao filtro informado, serão capturadas todas as requisições que possuírem um parâmetro Path "/normal" e um parâmetro Query "fields" com qualquer conteúdo (*). 

Dica
titleDICA

Para PATH com valor obrigatório informe ?* (interrogação seguido de asterisco), que determina que o PATH tem ao menos 1 caracter qualquer (?), seguido de 0 ou mais caracteres (*).

Exemplo: "/normal/?*/", #--# Path Param obrigatório a ser filtrado #--#

Bloco de código
languageerl
CALL _ADVPL_add_rest_logix_routes("GET",                           
 	                              "/*",                            
 	                              "order=dimensao",                
 	                              "wms_v1_get_dimensoes_ordenado")

    Neste exemplo, está sendo definido uma outra rota, sendo que toda requisição de método GET, que contenha qualquer parâmetro Path ("/*"  indica "Todos Paths" ou "nenhum") e um parâmetro Query "order" com valor "dimensao" será direcionada para a função wms_v1_get_dimensoes_ordenado.

Bloco de código
languageerl
CALL _ADVPL_add_rest_logix_routes("GET",                          
 	                              "/*",                           
 	                              "",                             
 	                              "wms_v1_get_dimensoes")

    Neste exemplo, todas as requisições de método GET, que possuírem quaisquer parâmetros (Query e/ou Path) informados, serão direcionadas para a função wms_v1_get_dimensoes.

Bloco de código
languageerl
CALL _ADVPL_add_rest_logix_routes("POST",                        
 	                              "/*",                         
 	                              "",                           
 	                              "wms_v1_update_dimensoes")

...

FUNCTION wms_v1_dimensoes_get_normal(l_json_reference)
#------------------------------------------------------#
{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


IMPORTANTE

Dica

Para PATH com valor obrigatório informe ?* (interrogação seguido de asterisco), que determina que o PATH tem ao menos 1 caracter qualquer (?), seguido de 0 ou mais caracteres (*).

Exemplo: "/normal/?*/", #--# Path Param obrigatório a ser filtrado #--#


OBSERVAÇÕES

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 determina um único caracter obrigatório e o sinal "*" (asterisco) para um conjunto de caracteres variáveis (zero ou mais caracteres). Neste caso, quando houver necessidade de ter ao menos 1 caracter obrigatório, deve-se informar "?*" que determinará "1 ou mais caracteres" e quando informar "*" (apenas asterisco) determinará "0 ou mais caracteres". 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.
    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.

...


05Formato 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
languagejs
{ 
    uri: valor,
	method: GET,
    headers: {},
	pathParams: [ "param1", "param2" ],
	queryParams: { query1: valor1, query2: valor1},
	payload: {}
}

...


06Classes 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:

...