Índice
Conceito
Uma API (acrônimo de Application Programming Interface ou Interface de Programação de Aplicação em português) é um conjunto de rotinas e padrões estabelecidos por um software para a utilização de seus recursos por aplicativos que não pretendem envolver-se em detalhes da implementação do software, mas apenas usar seus serviços. De modo geral, uma API é composta por uma série de funções acessíveis somente por programação e que permitem utilizar características do software menos evidentes ao usuário tradicional.
No desenvolvimento do produto Logix uma API antigamente chamava-se RNL acrônimo de Regra de Negócio Logix.
Desenvolvimento
Para o correto desenvolvimento é preciso ter em mente alguns cuidados que devem ser sempre considerados na construção de uma API:
- Nunca desenvolva ou solicite qualquer interação com o usuário, seja ela através de telas, mensagens ou perguntas;
- Simplifique suas funções, não é uma boa prática construir uma função "faz tudo", separe sempre sua lógica em diversas funções que possam ser executadas de formas distintas;
- Evite que suas funções dependam do produto, lembre-se que elas poderão ser executadas através de outros produtos ou serviços; e
- Sempre desenvolva visando a solução de único objetivo de negócio. Uma API para manutenção de pedidos não pode conter manutenção de empresas, por exemplo.
Nos próximos itens deste documento, serão detalhadas as técnicas que devem ser seguidas na construção do código fonte da API.
Clique AQUI para obter o código 4GL base de uma API para desenvolvimento e complemente o código conforme a necessidade da sua API.
Para específicos
Utilize sempre como base para a criação de uma API TOTVS o Guia de Implementação de API TOTVS, disponível em: http://tdn.totvs.com/x/nDUxE
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.
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 e está disponível para utilização conforme apresentado no quadro abaixo:
Matriz de Evolução
Versão / Release | Funcionalidade |
---|---|
12.1.22 | Requisições através dos verbos GET / POST / PUT / DELETE utilizando o contexto /restlogix Classe utilitária para tratamento das respostas da requisição (response) em 4GL. |
12.1.24 | Requisições através dos verbos GET / POST / PUT / DELETE utilizando o contexto /api Classe utilitária para tratamento das respostas da requisição (response) em 4GL. O contexto /restlogix está em processo de depreciação. |
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
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.
A sub-pasta "api" passa a concentrar todas as funcionalidades de integração dos 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.
Importante
Os programas 4GL disponibilizados, deverão seguir o padrão de localização abaixo:
Exemplos:
Objeto de Negócio | Função de roteamento |
---|---|
\suprimentos\obrigacoes_fiscais\api\v1\transportadoras.4gl | obf_v1_transportadoras |
\suprimentos\suprimentos\api\v1\estoque.4gl | sup_v1_estoque |
\adm_producao\manufatura\api\v1\apontamento_horas.4gl | man_v1_apontamento_horas |
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:
04. Exemplo de desenvolvimento das funções em 4GL
NOMES DAS FUNÇÕES
Exemplo de definição de funções e como será realizada a requisição WEB de execução destas funções:
Função | Requisição |
---|---|
|
|
|
|
|
|
APIS Específicas de clientes (Fábrica de Software)
Para funções de APIs específicas mantidas pela Fábrica de Software, conforme citado na nota IMPORTANTE no final do tópico 03. Serviços 4GL, a sigla do módulo indicada no início das funções é acrescida de "e".
Exemplos:
obfe_v1_transportadoras()
supe_v1_estoque()
mane_v1_apontamento_horas()
Quais funções devem sempre existir e respeitar padronização de nomenclatura:
- Função principal roteadora. Esta função não possui parâmetros e tem como objetivo a definição das rotas.
- Funções definidas na função roteadora para cada uma das rotas. Estas funções devem ter sempre a definição de 1 parâmetro do tipo VARCHAR(10) que será a referência do objeto de classe LJsonObject que é enviado no ato de toda requisição. Também sempre devem ter um retorno no formato JSON que será o retorno da requisição, utilizando para isso a classe LRestLogixResponse. Ambas classes estão detalhadas em Classes Utilitárias.
EXEMPLO DE IMPLEMENTAÇÃO
IMPORTANTE
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
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.
05. Formato Mensagem JSON
A variável de referência de um objeto LJSONOBJECT, recebida pela requisição como parâmetro na função 4GL definida na rota conterá informações completas da requisição, desde informações do HEADER, QUERY PARAMs, PATH PARAMs e o próprio PAYLOAD.
Através desta mensagem, o desenvolvedor poderá efetuar os devidos filtros e lógicas necessárias.
EXEMPLO DE MENSAGEM JSON
{ uri: valor, method: GET, headers: {}, pathParams: [ "param1", "param2" ], queryParams: { query1: valor1, query2: valor1}, payload: {} }
06. 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:
LJSONObject
Permite manipular o JSON recebido como parâmetro pela função.
Acesse a documentação referente ao componente Logix LJSONOBJECT para saber mais detalhes de como manipular informações recebidas num formato JSON.
LRestLogixResponse
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.
07. Exemplo de montagem do JSON de retorno
EXEMPLO MONTAGEM DO JSON DE RETORNO DA REQUISIÇÃO
08. Exemplo de leitura dos dados da requisição
EXEMPLO DE LEITURA DOS DADOS ENVIADOS NO JSON DA REQUISIÇÃO
A leitura dos dados do JSON da requisição é realizada utilizando a função _ADVPL_get_property(l_json_reference, "VALUE",<campo>)