2017-02-21 26 views
1

В настоящее время я работаю над автоматизацией вызова 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 
     } 

} 

ответ

1

Таким образом, после делать много расследования, я обнаружил способ.

Проблема, с которой я столкнулся, заключалась в том, что контейнер для куки-файлов терялся между моими звонками. Печенье контейнер в .net хранится в $ CookieContainer

Все, что я должен был сделать при создании контейнера, печенья, я должен был сделать это Global

$global:CookieContainer = New-Object System.Net.CookieContainer 

Тогда во время мой первый вызов, который является для входа в систему, назначить то же самое, что и контейнер для печенья

$req.CookieContainer = $CookieContainer 

Таким образом, во время входа в систему, когда же сменяет, переменная $ cookiecontainer хранится со значением и все последующие вызовы Rest имеет один и тот же контейнер печенья

$ req.CookieContainer = $ CookieContainer

Вы можете просто использовать , пока не закроете сеанс.

+0

Thats довольно хороший способ. Немного модификации ответа, сохраняющего контекст. –