Bom dia,
Estou fazendo uma requisição POST via rest e preciso passar alguns parâmetros via body, estou usando como referencia esse link:
https://tdn.totvs.com/display/tec/HTTPPost
Mas não consigo retorno, usando o POSTMAN eu consigo o retorno com sucesso, como eu poderia está fazendo no ADVPL?
É uma requisição de token do sharepoint e preciso enviar no body alguns dados como:
grant_type: client_credentials
client_id: ClientID@TenantID
client_secret: ClientSecretresource: resource/SiteDomain@TenantID
O retorno esperado é um token valido, mas só consigo via POSTMAN, quando vou para o advpl me retorna erro.
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.
Boa tarde, fiz esse teste com aqueles itens do POSTMAN que fica oculto, mas quando uso eu tenho retorno “Bad Request - Invalid Header”
Existe algum endereço de homologação para você passar os dados e tentarmos de forma local simular essa situação?
Sim, estou usando um ambiente dev, a requisição é nesse link:Sign in to your account
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.
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
Bom dia, funcionou perfeitamente, apanhei para os caracteres, muito obrigado pela ajuda e pelos links de referencias, abraço.
Bom dia, Anderson!
Estou tentando fazer a mesma conexão via postman e estou tendo como retorno
HTTP Error 400. The request hostname is invalid!
Consegue me ajudar?
Obrigada!