Page tree

Método GET

Produto:

ADVPL

Versões:

 

Ocorrência:

Gostaria de um material que explicasse realmente como implementar a tecnologia RESTFul no Protheus, com exemplos de APIs, exemplos de programas externos consumindo o serviço, e exemplos de envio e recebimento de dados. 

Ambiente:

Todos

Passo a passo:

O método GET é responsável por retornar ao cliente requisitador alguma coisa qualquer, como por exemplo uma lista de clientes cadastrados.

Vamos ver abaixo um exemplo de método GET:

WSMETHOD GET WSSERVICE CLIENTES

Local aArea := GetArea()

Local cNextAlias := GetNextAlias()

Local oCliente := CLIENTES():New() // –> Objeto da classe cliente

Local oResponse := FULL_CLIENTES():New() // –> Objeto que será serializado

Local cJSON := “”

Local lRet := .T.

 

BeginSQL Alias cNextAlias

SELECT A1_COD, A1_LOJA, A1_NOME, A1_END, A1_CGC, A1_CEP, A1_DDD, A1_TEL

FROM %table:SA1% SA1

WHERE SA1.%notdel%

EndSQL

(cNextAlias)->( DbGoTop() )

If (cNextAlias)->( !Eof() )

While (cNextAlias)->( !Eof() )

oCliente:SetCodigo( AllTrim((cNextAlias)->A1_COD ))

oCliente:SetLoja( AllTrim((cNextAlias)->A1_LOJA))

oCliente:SetNome( AllTrim((cNextAlias)->A1_NOME))

oCliente:SetCGC( AllTrim((cNextAlias)->A1_CGC ))

oCliente:SetCEP( AllTrim((cNextAlias)->A1_CEP ))

oCliente:SetEnd( AllTrim((cNextAlias)->A1_END ))

oCliente:SetDDD( AllTrim((cNextAlias)->A1_DDD ))

oCliente:SetTel( AllTrim((cNextAlias)->A1_TEL ))

oResponse:Add(oCliente)

(cNextAlias)->( DbSkip() )

EndDo

cJSON := FWJsonSerialize(oResponse, .T., .T.,,.F.)

::SetResponse(cJSON)

Else

SetRestFault(400, “SA1 Empty”)

lRet := .F.

EndIf

RestArea(aArea)

Return(lRet)

Explicação do trecho de código acima:

Conforme FAQ, para serialização de um objeto JSON, precisamos passar um objeto para a função FWJSONSerialize, para isso nas linhas 5 e 6 temos a declaração de duas variáveis que são objetos das classes CLIENTES e FULL_CLIENTES.

CLIENTES é onde armazenamos os atributos do cliente.
FULL_CLIENTES é onde armazenamos uma lista dos objetos da classe CLIENTES

Na sequência fazemos uma query na tabela de clientes (SA1).

Na linha 19 temos a condição (cNextAlias)->( !Eof() ) , nesse momento eu verifico se a minha query retornou algum resultado.

Retorno da condicional positivo:

Caso tenha retornado então iremos alimentar os objetos como podemos ver o trecho de código entre as linhas 21 e 35.

Entre as linhas 23 e 30 alimentamos o objeto oCliente com os dados do cliente.

Na linha 32 adicionamos o objeto cliente já alimentado, na lista de clientes oResponse pois será essa lista que iremos serializar.

Após sair do loop onde alimentamos os objetos, utilizamos o seguinte comando para transformar a nossa lista de clientes (oResponse) em uma string JSON serializada e na sequência utilizamos o comando SetResponse para enviar a string ao cliente.

cJSON := FWJsonSerialize(oResponse, .T., .T.,,.F.)

::SetResponse(cJSON)

Retorno da condicional negativo:

Caso minha query não retorne nenhum registro então iremos utilizar a função SetRestFault para retornar um código HTTP de erro e uma mensagem.

SetRestFault(400, “SA1 Empty”)

Exemplo de retorno com o resultado negativo da condicional (sem dados no SA1):

1

Exemplo de retorno com o resultado positivo da condicional (com dados no SA1):

2

Observações:

O Postman foi utilizado como exemplo de consumo em uma ferramenta externa, a TOTVS não presta suporte a ferramentas de terceiros, somente analisa o serviço e/ou consumo utilizando os recursos documentados e disponíveis para customização.

Documentações de referência:

http://tdn.totvs.com/display/tec/REST

http://tdn.totvs.com/display/tec/Interface+HTTP

http://tdn.totvs.com/display/framework/FWRest