Árvore de páginas

Método POST

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 POST é responsável por incluir ou processar algum tipo de informação enviada pelo client.

Vamos ver abaixo um exemplo de método post:

Iremos receber um JSON com dados de um cliente e realizar a inclusão do mesmo caso não exista na base de dados.

Estrutura do JSON que vamos receber:

1

WSMETHOD POST WSRECEIVE RECEIVE WSSERVICE CLIENTES

Local cJSON := Self:GetContent() // Pega a string do JSON

Local oParseJSON := Nil

Local aDadosCli := {} //–> Array para ExecAuto do MATA030

Local cFileLog := “”

Local cJsonRet := “”

Local cArqLog := “”

Local cErro := “”

Local cCodSA1 := “”

Local lRet := .T.

Private lMsErroAuto := .F.

Private lMsHelpAuto := .F.

// –> Cria o diretório para salvar os arquivos de log

If !ExistDir(“\log_cli”)

MakeDir(“\log_cli”)

EndIf

// –> Deserializa a string JSON

FWJsonDeserialize(cJson, @oParseJSON)

SA1->( DbSetOrder(3) )

If !(SA1->( DbSeek( xFilial(“SA1”) + oParseJSON:CLIENTE:CGC ) ))

cCodSA1 := GetNewCod()

Aadd(aDadosCli, {“A1_FILIAL” , xFilial(“SA1”) , Nil} )

Aadd(aDadosCli, {“A1_COD” , cCodSA1 , Nil} )

Aadd(aDadosCli, {“A1_LOJA” , “01” , Nil} )

Aadd(aDadosCli, {“A1_CGC” , oParseJSON:CLIENTE:CGC , Nil} )

Aadd(aDadosCli, {“A1_NOME” , oParseJSON:CLIENTE:NOME , Nil} )

Aadd(aDadosCli, {“A1_NREDUZ” , oParseJSON:CLIENTE:NOME , Nil} )

Aadd(aDadosCli, {“A1_END” , oParseJSON:CLIENTE:ENDERECO ,Nil}

Aadd(aDadosCli, {“A1_PESSOA” , Iif(Len(oParseJSON:CLIENTE:CGC)== 11, “F”, “J”) , Nil} )

Aadd(aDadosCli, {“A1_CEP” , oParseJSON:CLIENTE:CEP , Nil} )

Aadd(aDadosCli, {“A1_TIPO” , “F” , Nil} )

Aadd(aDadosCli, {“A1_EST” , oParseJSON:CLIENTE:ESTADO , Nil} )

Aadd(aDadosCli, {“A1_MUN” , oParseJSON:CLIENTE:MUNICIPIO,Nil} )

Aadd(aDadosCli, {“A1_TEL” , oParseJSON:CLIENTE:TELEFONE, Nil} )

MsExecAuto({|x,y| MATA030(x,y)}, aDadosCli, 3)

If lMsErroAuto

cArqLog := oParseJSON:CLIENTE:CGC + ” – ” +SubStr(Time(),1,5 ) + “.log”

RollBackSX8()

cErro := MostraErro(“\log_cli”, cArqLog)

cErro := TrataErro(cErro) // –> Trata o erro para devolver para o client.

SetRestFault(400, cErro)

lRet := .F.

Else

ConfirmSX8()

cJSONRet := ‘{“cod_cli”:”‘ + SA1->A1_COD + ‘”‘;

+ ‘,”loja”:”‘ + SA1->A1_LOJA + ‘”‘;

+ ‘,”msg”:”‘ + “Sucesso” + ‘”‘;

+’}’

::SetResponse( cJSONRet )

EndIf

Else

SetRestFault(400, “Cliente já cadastrado: ” + SA1->A1_COD + ” – ” + SA1->A1_LOJA)

lRet := .F.

EndIf

Return(lRet)

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

Linha 3 -> Pega o JSON recebido e armazena na variável cJson

Linha 19 -> Deserializa Json recebido utilizando a função FWJsonDeserialize e disponibiliza os dados do mesmo no objeto oParseJSON.

Na linha 22 temos uma condicional que verifica se o CPF/CNPJ recebido já consta em nossa base de dados.

Retorno Negativo da condicional:

Caso o CGC informado não exista na nossa base de dados, então vamos realizar a inclusão do cliente usando ExecAuto.

Montamos o array e chamamos a função MsExecAuto.

Retorno para o Client:

Se no MsExecAuto der algum tipo de inconsistência então retornamos a mensagem de inconsistência para o cliente utilizando a função SetRestFault como podemos ver na linha 51.
Caso contrário eu devolvo um JSON com o código e loja do cliente que acabou de ser incluído, como podemos ver na linha 59.

  • Repare que na linha 59 eu estou utilizando o comando SetResponse utilizando uma string que montei “na unha”, como podemos ver no seguinte trecho:

cJSONRet := ‘{“cod_cli”:”‘ + SA1->A1_COD + ‘”‘;

+ ‘,”loja”:”‘ + SA1->A1_LOJA + ‘”‘;

+ ‘,”msg”:”‘ + “Sucesso” + ‘”‘;

+’}’
Sim … Podemos montar o nosso JSON “na unha”, apesar de ser muito mais trabalhoso.

Exemplo de retorno com erro do execauto:

1

Exemplo de retorno com um cliente já existente na base de dados:

2

Exemplo de retorno com sucesso na inclusão de um cliente:

3

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