Como consumir um WS Rest gerando Token via AdvPL

No artigo de hoje, vamos demonstrar um exemplo de como consumir um WS gerando TOKEN via AdvPL.

Pessoal, esse exemplo utiliza a api padrão do WS REST com oAuth2, mas o conceito é o mesmo para outros WS onde você deve gerar o TOKEN para utilização (inclusive fizemos um tutorial, disponível em Como usar a autenticação com oAuth2 em REST).

O código fonte disponível aqui, foi gentilmente desenvolvido e disponibilizado pelo Alison Lemes ( LinkedIn ).

Basicamente a ideia é:

  1. A empresa do WS vai te disponibilizar um usuário e senha
  2. Você vai criar uma função em AdvPL, que vai mandar essa informação, e vai receber um Token
  3. Essa informação do token, você vai armazenar em uma variável
  4. Quando você for consumir outra API via WS, você passa esse TOKEN no header, por exemplo, como Bearer Token

Abaixo o código fonte de exemplo desenvolvido:

#include 'totvs.ch'

/*/{Protheus.doc} User Function getToken
    get Bearer Token using /token endpoint
    @type  Function
    @author Alison Kaique
    @since Feb|2022
    @version 1.0
    
    @return cToken, character, Bearer Token
/*/
User Function getToken()
    Local cToken     As Character // Bearer Token
    Local cBaseURL   As Character // Base URL
    Local cPath      As Character // endpoint path
    Local cGrantType As Character // grant type
    Local cUserName  As Character // user name
    Local cPassword  As Character // password
    Local cResponse  As Character // response
    Local cStatus    As Character // status code
    Local cError     As Character // error message
    Local oRest      As Object // FWRest() object
    Local jResponse  As Json // response JsonObject
    Local aHeader    As Array // request header

    // set values
    cGrantType := "password" // type here grant type to request
    cUserName  := "admin" // type here user name
    cPassword  := "1234" // type here user password
    cBaseURL   := "localhost:9090" // type here your base URL
    cPath      := "/api/oauth2/v1/token?grant_type=" + cGrantType + "&username=" + cUserName + "&password=" + cPassword // type here token endpoint
    aHeader    := {}

    Aadd(aHeader, "Authorization: Basic " + Encode64(cUserName + ":" + cPassword))
    Aadd(aHeader, "Content-Type: application/json")

    // FWRest() object
    oRest := FWRest():New(cBaseURL)
    oRest:setPath(cPath)

    // request
    If (oRest:Post(aHeader))
        cResponse := oRest:GetResult()
        jResponse := JsonObject():New()

        // is possible access this properties in response
        /**
            expires_in
            token_type
            scope
            access_token
            refresh_token
        **/

        If (ValType(jResponse:fromJson(cResponse)) == 'U')
            cToken := jResponse['access_token']
        EndIf
    Else
        cError  := oRest:GetLastError()
        cStatus := oRest:GetHTTPCode()
    EndIf
Return cToken

/*/{Protheus.doc} User Function tstToken
    just to test getToken() function
    @type  Function
    @author Alison Kaique
    @since Feb|2022
    @version 1.0
/*/
User Function tstToken(param_name)
    Local cToken As Character // bearer token

    cToken := u_getToken()
Return

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