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 é:
- A empresa do WS vai te disponibilizar um usuário e senha
- Você vai criar uma função em AdvPL, que vai mandar essa informação, e vai receber um Token
- Essa informação do token, você vai armazenar em uma variável
- 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.