Public/SimpleRequest.ps1
function Get-Matches() { param ( [Parameter(Mandatory = $true)] [string]$Content, [Parameter(Mandatory = $true)] [string]$Pattern ) Return [regex]::matches($Content, $Pattern, "Multiline") } function Get-Translation() { param ( [Parameter(Mandatory = $true)] [string]$Template, [Parameter(Mandatory = $true)] [PSObject]$Context ) $Pattern = "{{(.*?)}}" $Matches1 = Get-Matches -Content $Template -Pattern $Pattern $Result = $Template $Matches1 | ForEach-Object { $Search = $_.Groups[0] $TargetKey = $_.Groups[1].ToString() $Target = $Context[$TargetKey] if ($null -ne $Target) { $Result = $Result -replace $Search, $Target } } return $Result } function Get-WebRequestDefinition() { param ( [Parameter(Mandatory = $true)] [string]$Template, [Parameter(Mandatory = $true)] [PSObject]$Context ) $RequestObject = @{}; $EndpointPattern = "^\s*?(GET|POST|PUT|DELETE|PATCH)\s+(.*?)$" $HeaderPattern = "^\s*?([a-zA-Z0-9\-]+):\S*([^\r\f]*?)$" $PayloadPattern = "^\s*{([\s\S]*)}\s*$" $BasicMatches = Get-Matches -Content $Template -Pattern $EndpointPattern if (!$BasicMatches.Success -or ($BasicMatches.Groups.Count -ne 3)) { return @{Success= $false} } $Method = Get-RequestMethod -InputMethod $BasicMatches.Groups[1].Value $RequestObject.Add("Method", $Method.Trim()) $Uri = Get-Translation -Template $BasicMatches.Groups[2].Value -Context $Context $RequestObject.Add("Uri", $Uri.Trim()) $HeaderMatches = Get-Matches -Content $Template -Pattern $HeaderPattern if ($HeaderMatches.Success) { $Headers = @{}; $HeaderMatches | ForEach-Object { $HeaderKey = $_.Groups[1].Value.Trim() $HeaderValue = Get-Translation -Template $_.Groups[2] -Context $Context if ($Headers.ContainsKey($HeaderKey)){ $Headers.Remove($HeaderKey) } $Headers.Add($HeaderKey, $HeaderValue.Trim()) } $RequestObject.Add("Headers", $Headers) } $PayloadMatches = Get-Matches -Content $Template -Pattern $PayloadPattern if ($PayloadMatches.Success -and ($Method -ne "Get")) { $Raw = Get-Translation -Template $PayloadMatches.Value -Context $Context #$Payload = $Raw | ConvertFrom-Json $RequestObject.Add("Body", $Raw.Trim()) } $RequestObject.Add("Success", $true); return $RequestObject } function Get-RequestMethod() { param ( [Parameter(Mandatory = $true)] [string]$InputMethod ) $Method = $InputMethod.substring(0,1).toUpper() + $InputMethod.substring(1).toLower() return $Method } function Invoke-SimpleRequest() { [CmdletBinding()] param ( [Parameter(Mandatory = $false, ValueFromPipeline = $true)] [string]$Syntax, [Parameter(Mandatory = $false)] [PSObject]$Context = @{}, [Parameter(Mandatory = $false, ValueFromPipeline = $true)] [PSObject]$Path ) $Spliter = '#{3,}' if ([string]::IsNullOrWhiteSpace($Syntax) -and (-not [string]::IsNullOrWhiteSpace($Path))) { $Syntax = Get-Content -Path $Path -Encoding UTF8 -Raw } $RequestSyntaxes = [regex]::Split($Syntax, $Spliter) if ($RequestSyntaxes.Length -eq 0) { return null } else { $RequestSyntaxes | ForEach-Object { $Request = Get-WebRequestDefinition -Template $_ -Context $Context $ContentType = "application/json" if ($Request.Headers."Content-Type") { $ContentType = $Request.Headers."Content-Type"; } Invoke-WebRequest -Method $Request.Method -Uri $Request.Uri -Headers $Request.Headers -Body $Request.Body -ContentType $ContentType -UseBasicParsing } } } Export-ModuleMember -Function Invoke-SimpleRequest |