52

How can I call a rest based API from a PowerShell script and process the Json answer?

1

3 Answers 3

54

What you want is PowerShell 3 and its Invoke-RestMethod, ConvertTo-Json, and ConvertFrom-Json cmdlets. Your code will end up looking like:

 $stuff = Invoke-RestMethod -Uri $url -Method Get;

and there shouldn't even be a need to invoke ConvertFrom-Json on the resulting $stuff => it's already in a usable non-string format.

See http://technet.microsoft.com/en-us/Library/hh849971.aspx for details.

Sign up to request clarification or add additional context in comments.

3 Comments

You might also need to supply credentials. In this case you would make a command such as $stuff = Invoke-RestMethod -Uri $url -Method Get -Credential "domain\username".
Is there a way to pass in the credentials for Basic Auth? What Jubblerbug said works to present a popup asking for the password but I need to automate this
When using REST Method PUT you need to create a Body as well, see this excellent article for more help Open Tech Guides - How to call Azure Devops REST API from PowerShell
22

I created this Get-Http function to make HTTP requests

param([string]$url)

$req = [System.Net.WebRequest]::Create($url)
$req.Method ="GET"
$req.ContentLength = 0

$resp = $req.GetResponse()
$reader = new-object System.IO.StreamReader($resp.GetResponseStream())
$reader.ReadToEnd()

Dealing with the end result as xml is really easy, however, if you want to process JSON you probably will need some .Net library like JSON.Net.

Comments

5

We use Powershell to query a REST API that deals only with Json style data. It was awkward at first but the below code is all we need to perform most operations:

# Authentication
$webclient = New-Object System.Net.WebClient
$creds = New-Object System.Net.NetworkCredential("MyUsername","MyPassword");
$webclient.Credentials = $creds

# Data prep
$data = @{Name='Test';} | ConvertTo-Json

# GET
$webClient.DownloadString($url) | ConvertFrom-Json

# POST
$webClient.UploadString($url,'POST',$data)

# PUT
$webClient.UploadString($url,'PUT',$data)

4 Comments

this is powershell you use in production to consume web services?
I was answering a specific question related to interacting with a JSON API through PowerShell.I never said I'd use this code in production.
I'm confused, you're implying that this is somehow not proper code. IF you would not use this in production, then why not? and why post it?
I would not use this code in production because the credentials are hard-coded into the script as plain text. They should be script parameters and should be encrypted. This is just a sample script, it doesn't do anything, so I wouldn't put it into production because it doesn't do anything, other than answer the question that was asked here.I posted this in plain text because it is a simple answer to a simple question.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.