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: 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.
cJSONRet := ‘{“cod_cli”:”‘ + SA1->A1_COD + ‘”‘; + ‘,”loja”:”‘ + SA1->A1_LOJA + ‘”‘; + ‘,”msg”:”‘ + “Sucesso” + ‘”‘; +’}’ Exemplo de retorno com erro do execauto: Exemplo de retorno com um cliente já existente na base de dados: Exemplo de retorno com sucesso na inclusão de um cliente: |
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 |