I am attempting to communicate with the Graphql
api through powershell. According to Github, one must first do the following curl
call.
curl -H "Authorization: bearer token" -X POST -d " \
{ \
\"query\": \"query { viewer { login }}\" \
} \
" https://api.github.com/graphql
Using GitHub Enterprise, on powershell I do the following calls:
$url = "http://github.company.com/api/graphql" # note that it's http, not https
$body = "`"query`":`"query { viewer { login }}`"" #`
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("content-type","application/json")
$headers.Add("Authorization","bearer myTokenNumber")
$response = Invoke-WebRequest -Uri $url -Method POST -Body $body -Headers $headers
I keep getting the same error message, that there are problems parsing JSON.
I assume the error is with the body
tag, but I can't see how.
echo $body
gives "query":"query { viewer { login }}"
What is the issue here?
Exact error message:
Invoke-WebRequest : {"message":"Problems parsing JSON","documentation_url":"https://developer.github.com/v3"}
At line:1 char:13
+ $response = Invoke-WebRequest -Uri $url -Method POST -Body $body -Headers $heade ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebExc
eption
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
Your $body
value is malformed JSON, because it is missing the enclosing { ... }
.
Using a here-string makes the construction of the JSON string easier:
$body = @'
{ "query": "query { viewer { login } }" }
'@
Similarly, you can simplify building the headers with a hashtable literal:
$headers = @{
"content-type" = "application/json"
"Authorization" = "bearer myTokenNumber"
}
Here is the working program. Thanks to those who answered:
$url = "https://api.github.com/graphql" # regular github
# for enterprise it will be http(s)://[hostname]/api/graphql where hostname is
# usually github.company.com ... try with both http and https
$body = @'
{ "query": "query { viewer { login } }" }
'@
$headers = @{
"content-type" = "application/json"
"Authorization" = "bearer tokenCode"
}
$response = Invoke-WebRequest -Uri $url -Method POST -Body $body -Headers $headers
Write-Host $response
Output: {"data":{"viewer":{"login":"yourGithubUsername"}}}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With