I was recently tasked to write an automation script in PowerShell to invoke methods on a REST API. In this case, the API redirected the web requests to a more specific URL with an HTTP/302 response. When attempting to use POST, PUT, or any other methods besides GET, the REST API issued an HTTP/308 response and would not accept the web request. The solution was to capture the redirected URL, which is fairly straightforward in PowerShell.
$Uri = 'http://go.microsoft.com/fwlink/?LinkId=113387' $Results = Invoke-WebRequest -Method Get -Uri $Uri -MaximumRedirection 0 -ErrorAction SilentlyContinue
The key is to use the -MaximumRedirection parameter with a value of 0. This prevents PowerShell from following the HTTP/302. The result of Invoke-WebRequest is a WebResponseObject which contains a Headers property. Inside the Headers property is a Location key with the value being the redirected URL.
$Results | Get-Member
TypeName: Microsoft.PowerShell.Commands.WebResponseObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
BaseResponse Property System.Net.WebResponse BaseResponse {get;set;}
Content Property byte[] Content {get;set;}
Headers Property System.Collections.Generic.Dictionary[string,string] Headers {get;}
RawContent Property string RawContent {get;set;}
RawContentLength Property long RawContentLength {get;}
RawContentStream Property System.IO.MemoryStream RawContentStream {get;}
StatusCode Property int StatusCode {get;}
StatusDescription Property string StatusDescription {get;}
The Location key’s value contains the redirected URL.
$Results.Headers Key Value --- ----- Pragma no-cache X-AspNetMvc-Version 5.2 Connection keep-alive Content-Length 0 Cache-Control no-cache Date Sun, 23 Oct 2016 21:03:08 GMT Expires -1 Location http://technet.microsoft.com/library/hh849895.aspx Server Microsoft-IIS/8.5 X-AspNet-Version 4.0.30319 X-Powered-By ASP.NET
Below is an example using an if statement to check for the HTTP/302 status code before writing the redirected URL.
if ($Results.StatusCode -eq 302)
{
Write-Host $Results.Headers.Location
}
http://technet.microsoft.com/library/hh849895.aspx
