在 PowerShell 中创建自定义 POST-请求正文
Create custom POST-request body in PowerShell
我 运行 有点麻烦。我正在尝试使用 PowerShell 执行 POST 请求。问题是请求主体多次使用相同的密钥(您可以上传多张图片),所以我无法构建哈希表来发送请求。所以请求体看起来像这样:
name value
image 1.jpg
image 2.jpg
subject this is the subject
message this is a message
一位有类似问题(但上下文不同)的用户之前问过这个问题,得到的答复是使用带有 KeyValuePair 的列表 class。参见
我似乎无法创建它。我找到了这个 https://bensonxion.wordpress.com/2012/04/27/using-key-value-pairs-in-powershell-2/
他们使用 $testDictionary=New-Object “System.Collections.Generic.Dictionary[[System.String],[System.String]]”
制作字典,但这并不能转化为列表。
我设法通过使用 $r = New-Object "System.Collections.Generic.List[System.Collections.Generic.KeyvaluePair[string,string]]"
创建了(我认为需要的)
并使用 $s = New-Object “System.Collections.Generic.KeyvaluePair[string,string]"
创建了一个键,但我无法设置该键的值。
我也试过创建一个 FormObject,但是你也不能多次使用同一个键。
最好的and/or最简单的方法是什么?
我要回答我自己的问题。由于研究,我设法使用更好的搜索词,并找到了一个有完全相同问题的人:
Does Invoke-WebRequest support arrays as POST form parameters?
我通过将 [HttpWebResponse]
更改为 [System.Net.HttpWebResponse]
并添加了 -WebSession 参数来消除错误 (?)。我只需要它用于 cookie,所以我实现了它并且没有理会其他东西,它可能需要对其他人进行一些调整!
乍一看似乎可行,但是对于具有相同键的元素,它创建了一个数组,这打乱了请求体的顺序。没有正确的顺序,网站将不会接受它。
我又搞砸了一点,现在我编辑它以利用多维数组。
所以我最终得到了这个(所有功劳都归功于原作者!):
function Invoke-WebRequestEdit
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$true)][System.Uri] $Uri,
[Parameter(Mandatory=$false)][System.Object] $Body,
[Parameter(Mandatory=$false)][Microsoft.PowerShell.Commands.WebRequestMethod] $Method,
[Parameter(Mandatory=$false)][Microsoft.PowerShell.Commands.WebRequestSession] $WebSession
# Extend as necessary to match the signature of Invoke-WebRequest to fit your needs.
)
Process
{
# If not posting a NameValueCollection, just call the native Invoke-WebRequest.
if ($Body -eq $null -or $body.GetType().BaseType -ne [Array]) {
Invoke-WebRequest @PsBoundParameters
return;
}
$params = "";
$i = 0;
$j = $body.Count;
$first = $true;
foreach ($array in $body){
if (!$first) {
$params += "&";
} else {
$first = $false;
}
$params += [System.Web.HttpUtility]::UrlEncode($array[0]) + "=" + [System.Web.HttpUtility]::UrlEncode($array[1]);
}
$b = [System.Text.Encoding]::UTF8.GetBytes($params);
# Use HttpWebRequest instead of Invoke-WebRequest, because the latter doesn't support arrays in POST params.
$req = [System.Net.HttpWebRequest]::Create($Uri);
$req.Method = "POST";
$req.ContentLength = $params.Length;
$req.ContentType = "application/x-www-form-urlencoded";
$req.CookieContainer = $WebSession.Cookies
$str = $req.GetRequestStream();
$str.Write($b, 0, $b.Length);
$str.Close();
$str.Dispose();
[System.Net.HttpWebResponse] $res = $req.GetResponse();
$str = $res.GetResponseStream();
$rdr = New-Object -TypeName "System.IO.StreamReader" -ArgumentList ($str);
$content = $rdr.ReadToEnd();
$str.Close();
$str.Dispose();
$rdr.Dispose();
# Build a return object that's similar to a Microsoft.PowerShell.Commands.HtmlWebResponseObject
$ret = New-Object -TypeName "System.Object";
$ret | Add-Member -Type NoteProperty -Name "BaseResponse" -Value $res;
$ret | Add-Member -Type NoteProperty -Name "Content" -Value $content;
$ret | Add-Member -Type NoteProperty -Name "StatusCode" -Value ([int] $res.StatusCode);
$ret | Add-Member -Type NoteProperty -Name "StatusDescription" -Value $res.StatusDescription;
return $ret;
}
}
$body参数是这样写的:
$form=@()
$form+= ,@("value1",'somevalue')
$form+=,@("value2", 'somevalue')
$form+=,@("value2",'somevalue')
$form+=,@("value3",'somevalue')
现在一切看起来都很好。它仍然不起作用,但我的带有唯一键的原始版本也不再起作用,所以可能还有其他问题。
我 运行 有点麻烦。我正在尝试使用 PowerShell 执行 POST 请求。问题是请求主体多次使用相同的密钥(您可以上传多张图片),所以我无法构建哈希表来发送请求。所以请求体看起来像这样:
name value
image 1.jpg
image 2.jpg
subject this is the subject
message this is a message
一位有类似问题(但上下文不同)的用户之前问过这个问题,得到的答复是使用带有 KeyValuePair 的列表 class。参见
我似乎无法创建它。我找到了这个 https://bensonxion.wordpress.com/2012/04/27/using-key-value-pairs-in-powershell-2/
他们使用 $testDictionary=New-Object “System.Collections.Generic.Dictionary[[System.String],[System.String]]”
制作字典,但这并不能转化为列表。
我设法通过使用 $r = New-Object "System.Collections.Generic.List[System.Collections.Generic.KeyvaluePair[string,string]]"
创建了(我认为需要的)
并使用 $s = New-Object “System.Collections.Generic.KeyvaluePair[string,string]"
创建了一个键,但我无法设置该键的值。
我也试过创建一个 FormObject,但是你也不能多次使用同一个键。
最好的and/or最简单的方法是什么?
我要回答我自己的问题。由于研究,我设法使用更好的搜索词,并找到了一个有完全相同问题的人: Does Invoke-WebRequest support arrays as POST form parameters?
我通过将 [HttpWebResponse]
更改为 [System.Net.HttpWebResponse]
并添加了 -WebSession 参数来消除错误 (?)。我只需要它用于 cookie,所以我实现了它并且没有理会其他东西,它可能需要对其他人进行一些调整!
乍一看似乎可行,但是对于具有相同键的元素,它创建了一个数组,这打乱了请求体的顺序。没有正确的顺序,网站将不会接受它。
我又搞砸了一点,现在我编辑它以利用多维数组。 所以我最终得到了这个(所有功劳都归功于原作者!):
function Invoke-WebRequestEdit
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$true)][System.Uri] $Uri,
[Parameter(Mandatory=$false)][System.Object] $Body,
[Parameter(Mandatory=$false)][Microsoft.PowerShell.Commands.WebRequestMethod] $Method,
[Parameter(Mandatory=$false)][Microsoft.PowerShell.Commands.WebRequestSession] $WebSession
# Extend as necessary to match the signature of Invoke-WebRequest to fit your needs.
)
Process
{
# If not posting a NameValueCollection, just call the native Invoke-WebRequest.
if ($Body -eq $null -or $body.GetType().BaseType -ne [Array]) {
Invoke-WebRequest @PsBoundParameters
return;
}
$params = "";
$i = 0;
$j = $body.Count;
$first = $true;
foreach ($array in $body){
if (!$first) {
$params += "&";
} else {
$first = $false;
}
$params += [System.Web.HttpUtility]::UrlEncode($array[0]) + "=" + [System.Web.HttpUtility]::UrlEncode($array[1]);
}
$b = [System.Text.Encoding]::UTF8.GetBytes($params);
# Use HttpWebRequest instead of Invoke-WebRequest, because the latter doesn't support arrays in POST params.
$req = [System.Net.HttpWebRequest]::Create($Uri);
$req.Method = "POST";
$req.ContentLength = $params.Length;
$req.ContentType = "application/x-www-form-urlencoded";
$req.CookieContainer = $WebSession.Cookies
$str = $req.GetRequestStream();
$str.Write($b, 0, $b.Length);
$str.Close();
$str.Dispose();
[System.Net.HttpWebResponse] $res = $req.GetResponse();
$str = $res.GetResponseStream();
$rdr = New-Object -TypeName "System.IO.StreamReader" -ArgumentList ($str);
$content = $rdr.ReadToEnd();
$str.Close();
$str.Dispose();
$rdr.Dispose();
# Build a return object that's similar to a Microsoft.PowerShell.Commands.HtmlWebResponseObject
$ret = New-Object -TypeName "System.Object";
$ret | Add-Member -Type NoteProperty -Name "BaseResponse" -Value $res;
$ret | Add-Member -Type NoteProperty -Name "Content" -Value $content;
$ret | Add-Member -Type NoteProperty -Name "StatusCode" -Value ([int] $res.StatusCode);
$ret | Add-Member -Type NoteProperty -Name "StatusDescription" -Value $res.StatusDescription;
return $ret;
}
}
$body参数是这样写的:
$form=@()
$form+= ,@("value1",'somevalue')
$form+=,@("value2", 'somevalue')
$form+=,@("value2",'somevalue')
$form+=,@("value3",'somevalue')
现在一切看起来都很好。它仍然不起作用,但我的带有唯一键的原始版本也不再起作用,所以可能还有其他问题。