В настоящее время я работаю над автоматизацией вызова REST с помощью powershell. У меня есть REST API, который я вызывал с моим скриптом powershell с Invoke-WebRequest, как показано ниже.Переменная сеанса в версии powershell версии 2 - net.httpWebRequest
для входа в систему: -
Invoke-WebRequest -Method Post -uri $loginUri -ContentType application/x-www-form-urlencoded -Body $loginBody -Headers @{"Accept" = "application/xml"}
-SessionVariable CookieSession -UseBasicParsing
В выше URL-то вроде сервера/_Login и в теле, мои полномочия передаются как
$loginBody = "username=$username&password=$password"
Я получаю cookie (JSESSIONID) от этого вызова, а затем разбираю то же самое со всеми другими вызовами. Например
Мой Выход выглядит следующим образом: -
Invoke-WebRequest -Method Post -uri $logOutUri -ContentType application/xml -Headers @{"Accept" = "application/xml"}
-WebSession $ SessionVariable -UseBasicParsing
где Ссылка Server/_Logout и использование -WebSession я разбор печенье
Проблема в том, что я должен сделать это совместимым с версией powershell версии 2 и, следовательно, должен использовать [System.Net.HttpWebRequest]
Так что мне нужна функция для первого входа, которая вернет мне sessioncookie, а затем я должен разобрать этот файл cookie для всех других вызовов.
Ниже то, что я начал с, но не знаю, что дальше: -
function Http-Web-Request([string]$method,[string]$Accept,[string]$contentType, [string]$path,[string]$post)
{
$url = "$global:restUri/$path"
$CookieContainer = New-Object System.Net.CookieContainer
$postData = $post
$buffer = [text.encoding]::ascii.getbytes($postData)
[System.Net.HttpWebRequest] $req = [System.Net.HttpWebRequest] [System.Net.WebRequest]::Create($url)
$req.method = "$method"
$req.Accept = "$Accept"
$req.AllowAutoRedirect = $false
$req.ContentType = "$contentType"
$req.ContentLength = $buffer.length
$req.CookieContainer = $CookieContainer
$req.TimeOut = 50000
$req.KeepAlive = $true
$req.Headers.Add("Keep-Alive: 300");
$reqst = $req.getRequestStream()
$reqst.write($buffer, 0, $buffer.length)
try
{
[System.Net.HttpWebResponse] $response = $req.GetResponse()
$sr = New-Object System.IO.StreamReader($response.GetResponseStream())
$txt = $sr.ReadToEnd()
if ($response.ContentType.StartsWith("text/xml"))
{
## NOTE: comment out the next line if you don't want this function to print to the terminal
Format-XML($txt)
}
return $txt
}
catch [Net.WebException]
{
[System.Net.HttpWebResponse] $resp = [System.Net.HttpWebResponse] $_.Exception.Response
## Return the error to the caller
Throw $resp.StatusDescription
}
}
Thats довольно хороший способ. Немного модификации ответа, сохраняющего контекст. –