Powershell 2.0 网络请求 POST

Powershell 2.0 Webrequest POST

我是 Powershell 的初学者,想知道是否有人可以帮助我解决以下问题。

$baseurl = "some url address"
$Body = @{
    jsonrpc = "2.0"
    method = "user.login"
    params = @{
        user = "username"
        password = "password"
    }
    id = 1
    auth = $null
}

$BodyJSON = ConvertTo-Json $Body
write-host $BodyJSON
try {
    $zabSession = Invoke-RestMethod ("$baseurl/api_jsonrpc.php") -ContentType "application/json" -Body $BodyJSON -Method Post | `
    Select-Object jsonrpc,@{Name="session";Expression={$_.Result}},id,@{Name="URL";Expression={$baseurl}}

问题是我需要将以上内容转换为在 powershell 2.0 中使用,因为 invoke-restmethod 不起作用。有人可以提供代码或其他帮助我的东西吗?我正在苦苦挣扎。非常感谢!

为了在 PowerShell v2 中实现与 Invoke-RestMethod cmdlet 类似的功能,我相信您需要使用 .NET System.Net.WebRequest & System.IO.StreamWriter/StreamReader class.这是一个模仿 Invoke-RestMethod cmdlet 基本功能的快速函数。

function InvokeRest {
  [CmdletBinding()]
  Param (
    [Parameter(Mandatory = $true, Position = 0)]
    [string]$URI,

    [Parameter(Mandatory = $true, Position = 1)]
    [string]$ContentType,

    [Parameter(Mandatory = $false, Position = 2)]
    [string]$Body,

    [Parameter(Mandatory = $false, Position = 3)]
    [ValidateSet('POST', 'GET')] #You can extend this to all the System.Net.WebRequest methods.
    [string]$Method = 'POST'
  )

  try {
    $restRequest = [System.Net.WebRequest]::Create($URI)
    $restRequest.ContentType = $ContentType
    $restRequest.Method = $Method

    if ($Method -eq 'POST') {
      $encoding = [System.Text.Encoding]::UTF8

      $restRequestStream = $restRequest.GetRequestStream()
      $restRequestWriter = New-Object System.IO.StreamWriter($restRequestStream, $encoding)
      
      $restRequestWriter.Write($Body)
    }
  }
  finally {
    if ($null -ne $restStream) { $restRequestStream.Dispose() }
    if ($null -ne $restWriter) { $restRequestWriter.Dispose() }
  }

  try {
    $restResponse = $restRequest.GetResponse()
    $restResponseStream = $restResponse.GetResponseStream()

    $responseStreamReader = New-Object System.IO.StreamReader($restResponseStream)

    $responseString = $responseStreamReader.ReadToEnd()
  }
  finally {
    if ($null -ne $restResponse) { $restResponse.Dispose() }
    if ($null -ne $restResponseStream) { $restResponseStream.Dispose() }
    if ($null -ne $responseStreamReader) { $responseStreamReader.Dispose() }
  }

  return $responseString
}

此函数将return 响应作为字符串。然后,您可以将字符串转换为适当的类型(ConvertFrom-Json/ConvertFrom-Yaml/custom 转换器)。