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.