2012-01-19 17 views
20

は、私は基本的なauthentaticationカールを使用してRESTのAPIでの作業を持っています。 このスクリプトは、RESTコードの認証チェックを無効にすると正常に動作します。PowerShellのHTTP POSTをREST API基本認証

curlに似たPOSTリクエストで資格情報を渡す、または後続のスクリプトを修正するためにできることは何ですか?

これに関するいくつかのガイダンスは本当にうれしいです。ありがとう。ここで

は私のPowerShellスクリプトです:

function Execute-HTTPPostCommand() { 
    param(
     [string] $target = $null 
    ) 

    $username = "user" 
    $password = "pass" 

    $webRequest = [System.Net.WebRequest]::Create($target) 
    $webRequest.ContentType = "text/html" 
    $PostStr = [System.Text.Encoding]::UTF8.GetBytes($Post) 
    $webrequest.ContentLength = $PostStr.Length 
    $webRequest.ServicePoint.Expect100Continue = $false 
    $webRequest.Credentials = New-Object System.Net.NetworkCredential -ArgumentList $username, $password 

    $webRequest.PreAuthenticate = $true 
    $webRequest.Method = "POST" 

    $requestStream = $webRequest.GetRequestStream() 
    $requestStream.Write($PostStr, 0,$PostStr.length) 
    v$requestStream.Close() 

    [System.Net.WebResponse] $resp = $webRequest.GetResponse(); 
    $rs = $resp.GetResponseStream(); 
    [System.IO.StreamReader] $sr = New-Object System.IO.StreamReader -argumentList $rs; 
    [string] $results = $sr.ReadToEnd(); 

    return $results; 

} 


$post = "volume=6001F930010310000195000200000000&arrayendpoint=2000001F930010A4&hostendpoint=100000051ED4469C&lun=2" 

$URL = "http://example.com/test/" 

Execute-HTTPPostCommand $URL 

答えて

17

、私は$のためHTTP_AUTHORIZATIONヘッダを付加しようとカールリクエストとリクエストの違いを見るためにフィドラーのように、いくつかのWebデバッガを使用するためにどのような場合にあなたを助言します

$webRequest.Headers.Add("AUTHORIZATION", "Basic YTph"); 

ここで、YTphはusername:passwordのbase64エンコード文字列です。

+0

をtroubleshoot-するために、システムの出力に、フォームの内容が、取得したページなどを表示するための変数は、ありがとう!これは私のためにやった。 –

+0

http://www.base64encode.org/を使用して、UTF-8 Base64文字列を取得できます。 – SeriousM

4

Credentialsプロパティには、Windows認証のために使われているようです。この機能を使用してみてください: Forcing Basic Authentication in WebRequest 私はあなたのコードがよさそうだ

16

私はこれが古いスレッドだと知っていますが、これを遭遇する人にとっては、invoke-restmethodは、PowerShellでAPI呼び出しを行うためのはるかに優れた、簡単な手段です。

は、ハッシュテーブルとしてパラメータリストをビルドします。

$params = @{uri = 'https:/api.trello.com/1/TheRestOfYourURIpath'; 
        Method = 'Get'; #(or POST, or whatever) 
        Headers = @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$($acctname):$($password)")); 
      } #end headers hash table 
    } #end $params hash table 

$var = invoke-restmethod @params 

あなたのパラメータのハッシュテーブルは多少異なる場合があります。

私は実際にこれをTrelloで使うことはできませんでしたが、私はGitHub、Serena Business ManagerとJiraと一緒にいます。

+0

すべての注記: 'Invoke-RestMethod'は、ほとんどのJIRAの残りのapiリモート呼び出しでうまく動作します。しかし、私は 'Invoke-WebRequest'が問題の修正版と影響版(' fixVersions'と 'versions'、広範にテストされている)を更新するために必要であることを発見しました。タイムアウトが発生した場合は、少なくともこの2つの切り替えを検討してください。プライベートサーバのJIRAでは問題ですが、私の個人的なクラウドのJIRAインスタンスでは発生しません。 – bunkerdive

0

これは、ConfluenceからHTMLファイルとしてページをダウンロードするために使用するコードです。

$pageid = "176398584" ; 
$url = "http://wikiserver/wiki/pages/viewpage.action?pageId=$pageid" ; 
write-host "Establish credentials" ; 
$r = Invoke-WebRequest "http://wikiserver/wiki/pages/login.action" -SessionVariable my_session ; 
# $r ; 
$form = $r.Forms[1]; 
# $form ; 

# $c = $host.UI.PromptForCredential('Your Credentials', 'Enter Credentials', '', '') ; 
# $form.fields['os_username'] = $c.UserName ; 
# $form.fields['os_password'] = $c.GetNetworkCredential().Password ; 
$form.fields['os_username'] = "mywikirobotlogonname" ; 
$form.fields['os_password'] = "mywikirobotpassword" ; 
$form.fields['os_cookie']  = "true" ; 
$form.fields['os_destination'] = "%2Fpages%2Fviewpage.action%3FpageId%3D$pageid" ; 

$outputFile = "$pageid.html" ; 
$content = Invoke-WebRequest -Uri ($url + $form.Action) -WebSession $my_session -Method POST -Body $form.Fields ; 
$content.ParsedHTML.getElementById("content").innerHTML | Add-Content $outputFile 

ホストUIプロンプトを使用して、ユーザーにログオン情報の入力を求めることができます。

コメントを外し$ rを$フォーム$コンテンツ