Boa tarde Anderson,
Consegui simular o problema, o mesmo acontece por conta de alguns caracteres especiais presentes no seu client_secret
, é possível tratar esses caracteres com a função Escape
:
https://tdn.totvs.com/pages/releaseview.action?pageId=6814745
Veja aqui uma lista dos caracteres:
https://www.w3schools.com/tags/ref_urlencode.ASP
Abaixo um exemplo de como implementar esse POST em ADVPL:
#include "protheus.ch"
//-------------------------------------------------------------------
/*/{Protheus.doc} testRest
Efetua um POST como teste na API:
https://accounts.accesscontrol.windows.net
@author Daniel Mendes
@since 09/03/2020
@version 1.0
/*/
//-------------------------------------------------------------------
user function testRest()
local cUrl as char
local cPostParms as char
local aHeadStr as array
local cHeaderGet as char
local cRetPost as char
local jJsonToken
//URL da API
cUrl := "https://accounts.accesscontrol.windows.net/3d252e7e-c9f8-477e-b42b-af9b04cff399/tokens/OAuth/2"
cPostParms := "grant_type=client_credentials"
cPostParms += "&resource=00000003-0000-0ff1-ce00-000000000000/andersonarrais.sharepoint.com@3d252e7e-c9f8-477e-b42b-af9b04cff399"
cPostParms += "&client_id=689bd7e8-1964-4bf2-9ce5-80bb5d93f5e5@3d252e7e-c9f8-477e-b42b-af9b04cff399"
//Body do POST, alguns caracteres precisam ser trocados, tais como + e =
//Esse tratamento pode ter que ser replicado para outros pontos...
cPostParms += "&client_secret=" + Escape("ub9CMarQv4f3uAvpK1GYSDiOJMKSJ8pYaqcZE8hB+ng=")
//Header do POST
aHeadStr := {"Content-Type: application/x-www-form-urlencoded"}
//Efetua o POST na API
cRetPost := HTTPPost(cUrl, /*cGetParms*/, cPostParms, /*nTimeOut*/, aHeadStr, @cHeaderGet)
//Exibe o retorno do POST e também o header de retorno
ConOut("Retorno do POST:", cRetPost)
ConOut("Header do POST:", cHeaderGet)
//Transforma o retorno em um JSON
jJsonToken := JsonObject():New()
jJsonToken:FromJson(cRetPost)
//Exibe os dados com base no JSON
Conout("Tipo do token:", jJsonToken["token_type"])
Conout("Token gerado:", jJsonToken["access_token"])
return nil
Boa tarde Anderson, o POSTMAN costuma colocar diversas informações na requisição sem que você perceba, talvez seja o caso, verificar como foi criada a requisição quando enviada por lá, body e header, normalmente o header é o grande afetado pelo POSTMAN... Então, é possível que você precise enviar mais informações no header quando a requisição é feita em ADVPL.
— Daniel Mendes 09 de Mar de 2020Boa tarde, fiz esse teste com aqueles itens do POSTMAN que fica oculto, mas quando uso eu tenho retorno "Bad Request - Invalid Header"
— Anderson Arrais 09 de Mar de 2020Existe algum endereço de homologação para você passar os dados e tentarmos de forma local simular essa situação?
— Daniel Mendes 09 de Mar de 2020Sim, estou usando um ambiente dev, a requisição é nesse link:https://accounts.accesscontrol.windows.net/3d252e7e-c9f8-477e-b42b-af9b04cff399/tokens/OAuth/2
headers: application/x-www-form-urlencoded
E os dados do body segue abaixo separado por &: grant_type=client_credentials&resource=00000003-0000-0ff1-ce00-000000000000/andersonarrais.sharepoint.com@3d252e7e-c9f8-477e-b42b-af9b04cff399&client_id=689bd7e8-1964-4bf2-9ce5-80bb5d93f5e5@3d252e7e-c9f8-477e-b42b-af9b04cff399&client_secret=ub9CMarQv4f3uAvpK1GYSDiOJMKSJ8pYaqcZE8hB+ng=
O retorno deve ser um token.
— Anderson Arrais 09 de Mar de 2020