Forum Discussion
Connect to API - Bad Request Error
Hi.
I need some help getting data from an API using OAuth & bearer token.
Here is the code that I currently have:
let
//Create the variables
TokenURL = "xxx",
clientId = "xxx",
clientSecret = "xxx",
//Create the Token Request
GetJson = Web.Contents(TokenURL,
[
Headers = [#"Content-Type"="application/json"],
Content = Text.ToBinary("{""clientId"":" & clientId &",""clientSecret"":"& clientSecret & "}"
) ]
),
FormatAsJson = Json.Document(GetJson),
// Gets token from the Json response
AccessToken = FormatAsJson[access_token],
AccessTokenHeader = "bearer " & AccessToken,
// ???
GetJsonQuery = Web.Contents("xxx",
[
Headers = [#"wb-authorization"=AccessTokenHeader]
]
),
FormatAsJsonQuery = Json.Document(GetJsonQuery)
in
#"FormatAsJsonQuery"
I am receiving an error DataSource.Error: Web.Contents failed to get contents from 'xxx' (400): Bad Request
So I suspect that my syntax may be incorrect on this line:
Content = Text.ToBinary("{""clientId"":" & clientId &",""clientSecret"":"& clientSecret & "}"
I have test the request in Postman using this curl and it works
curl --location --request POST 'xxx' \
--header 'Content-Type: application/json' \
--data-raw '{ "clientId": "xxx", "clientSecret": "xxx"
}'
5 Replies
- v-lid-msftCommunity Support
Hi pablopablo ,
Could you please use following query to see if the problem is in create the tekon request step?
let //Create the variables TokenURL = "xxx", clientId = "xxx", clientSecret = "xxx", //Create the Token Request GetJson = Web.Contents(TokenURL,[Headers = [#"Content-Type"="application/json"],Content = Text.ToBinary("{""clientId"":" & clientId &",""clientSecret"":"& clientSecret & "}")]) in GetJsonwe can also try to use some tools to see if power bi desktop has send the right web request, such as Fiddler Trace: https://docs.microsoft.com/en-us/power-bi/developer/embedded-troubleshoot
Best regards,- pablopabloFrequent Visitor
Hi,
I managed to get this working to the point where it is collecting a token and parsing it to the endpoint, however I am now getting an error - "Please specify how to conect"
code is:
/* */ let //Create the variables TokenURL = "xxx", clientId = """xxx""", clientSecret = """xxx""", //Create the Token Request GetJson = Web.Contents(TokenURL, [ Headers = [#"Content-Type"="application/json"], Content = Text.ToBinary("{""clientId"": " & clientId & ", ""clientSecret"": "& clientSecret & "}") ] ), FormatAsJson = Json.Document(GetJson), // Gets token from the Json response AccessToken = FormatAsJson[access_token], AccessTokenHeader = "bearer " & AccessToken, // ??? GetJsonQuery = Web.Contents("xxx", [ Headers=[#"wb-authorization"= AccessTokenHeader, ContentType="application/json"] ] ), FormatAsJsonQuery = Json.Document(GetJsonQuery) in #"FormatAsJsonQuery"- v-lid-msftCommunity Support
Hi pablopablo ,
It seems like add "" to the client fix the previous problem? If you got a warning like following, please try to edit with Anonymous since you have put the token inside the Header.
Best regards,
- AnonymousNot applicable
Your problem is is Create the token request part , so just correct that part with this code, it will work.
let apiUrl = "https://login.windows.net/61xxxxxxxxxxxx/oauth2/token", body = [ client_id="3728xxxxxxxxxxxxxx5", client_secret="bxxxxxxxxxxxxh" ], Source = Json.Document(Web.Contents(apiUrl, [Headers = [Accept = "application/json"], Content = Text.ToBinary(Uri.BuildQueryString(body))])) in Source