Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Invoke-WebRequest failed - "Problems parsing json" with GitHub api

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
like image 489
K Split X Avatar asked Feb 08 '18 23:02

K Split X


2 Answers

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"
}
like image 157
mklement0 Avatar answered Nov 13 '22 04:11

mklement0


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

like image 4
K Split X Avatar answered Nov 13 '22 05:11

K Split X