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 转换器)。
我是 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 转换器)。