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.