Nesse vídeo será demonstrado em como consumir APIs externas no Protheus via FWRest com e sem utilização de TOKEN.
Abaixo o vídeo no nosso canal no YouTube:
Abaixo o primeiro exemplo (sem autenticação):
//Bibliotecas #Include "TOTVS.ch" /*/{Protheus.doc} User Function zConsum1 Exemplo de consumo de REST usando FWRest sem autenticação @type Function @author Atilio @since 20/05/2025 /*/ User Function zConsum1() Local aArea := FWGetArea() Local aHeader := {} Local oRestClient := FWRest():New("https://viacep.com.br/ws") Local cCep := FWInputBox("Informe um CEP: ") //Adiciona os headers que serão enviados via WS aAdd(aHeader,'User-Agent: Mozilla/4.0 (compatible; Protheus '+GetBuild()+')') aAdd(aHeader,'Content-Type: application/json; charset=utf-8') //Define a url conforme o CEP e aciona o método GET oRestClient:setPath("/"+cCep+"/json/") If oRestClient:Get(aHeader) //Exibe o resultado que veio do WS ShowLog(oRestClient:cResult) //Senão, pega os erros, e exibe em um Alert Else cLastError := oRestClient:GetLastError() cErrorDetail := oRestClient:GetResult() Alert(cErrorDetail) Endif FWRestArea(aArea) Return
Abaixo o segundo exemplo (com Basic Token):
//Bibliotecas #Include "TOTVS.ch" /*/{Protheus.doc} User Function zConsum2 Exemplo de consumo de REST usando FWRest com Basic Token @type Function @author Atilio @since 20/05/2025 /*/ User Function zConsum2() Local aArea := FWGetArea() Local cUsrLogin := Alltrim(SuperGetMV("MV_X_WSUSR", .F., "daniel.atilio")) Local cUsrSenha := Alltrim(SuperGetMV("MV_X_WSPAS", .F., "tst123")) Local cBasicAuth := Encode64(cUsrLogin + ":" + cUsrSenha) Local aHeader := {} Local cURL := "http://127.0.0.1:8401/rest/Transportadoras" Local cPath := "/get_all" Local oRestClient := FWRest():New(cURL) Local jResultado Local jAtual Local aDados := {} Local nAtual := 0 Local nId := 0 Local cName := "" Local cEmail := "" Local cWhatsApp := "" //Adiciona os headers que serão enviados via WS aAdd(aHeader, 'Authorization: Basic ' + cBasicAuth) //Define a url oRestClient:setPath(cPath) If oRestClient:Get(aHeader) //Exibe o resultado que veio do WS ShowLog(oRestClient:cResult) jResultado := JsonObject():New() jResultado:FromJson(oRestClient:cResult) //Busca as transportadoras aDados := jResultado:GetJsonObject("objects") //Percorre as transportadoras For nAtual := 1 To Len(aDados) jAtual := aDados[nAtual] nId := jAtual:GetJsonObject("id") cName := jAtual:GetJsonObject("name") cEmail := jAtual:GetJsonObject("email") cWhatsApp := jAtual:GetJsonObject("whatsapp") FWAlertInfo(; "Id: " + cValToChar(nId) + CRLF +; "Name: " + cName + CRLF +; "eMail: " + cEmail + CRLF +; "WhatsApp: " + cWhatsApp ; , "Atenção") Next //Senão, pega os erros, e exibe em um Alert Else cLastError := oRestClient:GetLastError() cErrorDetail := oRestClient:GetResult() Alert(cErrorDetail) Endif FWRestArea(aArea) Return
E abaixo o terceiro exemplo (com Bearer Token):
//Bibliotecas #Include "TOTVS.ch" /*/{Protheus.doc} User Function zConsum3 Exemplo de consumo de REST usando FWRest com Bearer Token @type Function @author Atilio @since 20/05/2025 /*/ User Function zConsum3() Local aArea := FWGetArea() Local cUsrLogin := Alltrim(SuperGetMV("MV_X_WSUSR", .F., "daniel.atilio")) Local cUsrSenha := Alltrim(SuperGetMV("MV_X_WSPAS", .F., "tst123")) Local cBearerAut := fBearer(cUsrLogin, cUsrSenha) Local aHeader := {} Local cURL := "http://127.0.0.1:8401/rest/Transportadoras" Local cPath := "/get_all" Local oRestClient := FWRest():New(cURL) Local jResultado Local jAtual Local aDados := {} Local nAtual := 0 Local nId := 0 Local cName := "" Local cEmail := "" Local cWhatsApp := "" //Se houver token If ! Empty(cBearerAut) oRestClient := FWRest():New(cURL) //Adiciona os headers que serão enviados via WS aAdd(aHeader, 'Authorization: Bearer ' + cBearerAut) //Define a url oRestClient:setPath(cPath) If oRestClient:Get(aHeader) //Exibe o resultado que veio do WS ShowLog(oRestClient:cResult) jResultado := JsonObject():New() jResultado:FromJson(oRestClient:cResult) //Busca as transportadoras aDados := jResultado:GetJsonObject("objects") //Percorre as transportadoras For nAtual := 1 To Len(aDados) jAtual := aDados[nAtual] nId := jAtual:GetJsonObject("id") cName := jAtual:GetJsonObject("name") cEmail := jAtual:GetJsonObject("email") cWhatsApp := jAtual:GetJsonObject("whatsapp") FWAlertInfo(; "Id: " + cValToChar(nId) + CRLF +; "Name: " + cName + CRLF +; "eMail: " + cEmail + CRLF +; "WhatsApp: " + cWhatsApp ; , "Atenção") Next //Senão, pega os erros, e exibe em um Alert Else cLastError := oRestClient:GetLastError() cErrorDetail := oRestClient:GetResult() Alert(cErrorDetail) Endif EndIf FWRestArea(aArea) Return Static Function fBearer(cUsrLogin, cUsrSenha) Local oRestToken Local cUrl := "http://localhost:8401/rest/api/oauth2/v1/" Local cToken := "" Local aHeaders := {} Local jResponse Default cUsrLogin := "" Default cUsrSenha := "" //Instancia o WS oRestToken := FWRest():New(cURL) //Define a url oRestToken:setPath("token?grant_type=password&password=" + cUsrSenha + "&username=" + cUsrLogin) If oRestToken:Post(aHeaders) //Pega o JSON de resposta, e pega o token jResponse := JsonObject():New() jResponse:FromJson(oRestToken:cResult) //Pega o Token de acesso cToken := Iif( ValType(jResponse['access_token']) != "U", jResponse['access_token'], "") EndIf Return cToken
Abaixo alguns links que foram usados como apoio para montagem do vídeo:
- https://viacep.com.br/
- https://docs.arquivei.com.br/
- https://api.totvs.com.br/
- https://tipremium.com/page.php?slug=curso-webservices
- https://www.postman.com/downloads/
Bom pessoal, por hoje é só.
Abraços e até a próxima.