5
votes

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
2
Can you please share the exact error message?Daniel
Please check nowK Split X
Have you tested your token and Query in GitHub's GraphQL Explorer Interface ?Daniel
Works perfectly thereK Split X
Is there a reason why you have to use the http version?Daniel

2 Answers

4
votes

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"
}
4
votes

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"}}}