Consumindo APIs externas em REST com e sem TOKEN no Protheus via AdvPL / TLPP | Ti Especial 0005

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:

 

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação