#powershell
#powershell
Вопрос:
Что я сейчас делаю:
Invoke-WebRequest -Uri https://coolWebsite.com/ext/ext -ContentType application/json -Method POST -Body $someJSONFile
Я ищу способ опубликовать то же самое.файл json в Powershell без использования Invoke-WebRequest, если это возможно. Этот новый метод предпочтительно позволил бы мне получать содержимое вывода сервера и анализировать его в powershell.
Может быть, путем вызова внешнего метода cURL? Я действительно не уверен, и все мои интернет-исследования оказались бесплодными.
Как я могу добиться этого результата без Invoke-WebRequest?
Комментарии:
1. не уверен, поможет ли это, но это помогло мне сделать нечто подобное ранее: blogs.technet.com/b/heyscriptingguy/archive/2012/10/08 /…
2. Хм. Это интересное сообщение в блоге, но оно как бы пропускает ту часть — если она вообще включена — где json фактически загружается в URL.
3. Да, как я уже сказал, это помогло мне справиться с моей проблемой, но я надеялся, что это даст вам некоторое представление о том, как вы могли бы это сделать.
4. Вы можете записывать содержимое, возвращаемое сервером на a
POST
при использованииinvoke-webrequest
. Это единственная причина, по которой вы не используете то, что поставляется с PowerShell? Как насчетSystem.Net.WebClient
?5. @alroc Нет, у меня возникли проблемы с интеграцией этого с TeamCity. Я нашел решение:
Invoke-RestMethod -Uri coolWebsite.com -ContentType application/json -Method POST -Body $someFile
Ответ №1:
Вы можете попробовать это :
# RestRequest.ps1
Add-Type -AssemblyName System.ServiceModel.Web, System.Runtime.Serialization, System.Web.Extensions
$utf8 = [System.Text.Encoding]::UTF8
function Request-Rest
{
[CmdletBinding()]
PARAM (
[Parameter(Mandatory=$true)]
[String] $URL,
[Parameter(Mandatory=$false)]
[System.Net.NetworkCredential] $credentials,
[Parameter(Mandatory=$true)]
[String] $JSON)
# Remove NewLine from json
$JSON = $JSON -replace "$([Environment]::NewLine) *",""
# Create a URL instance since the HttpWebRequest.Create Method will escape the URL by default.
# $URL = Fix-Url $Url
$URI = New-Object System.Uri($URL,$true)
try
{
# Create a request object using the URI
$request = [System.Net.HttpWebRequest]::Create($URI)
# Build up a nice User Agent
$UserAgent = "My user Agent"
$request.UserAgent = $("{0} (PowerShell {1}; .NET CLR {2}; {3})" -f $UserAgent, $(if($Host.Version){$Host.Version}else{"1.0"}),
[Environment]::Version,
[Environment]::OSVersion.ToString().Replace("Microsoft Windows ", "Win"))
$request.Credentials = $credentials
$request.KeepAlive = $true
$request.Pipelined = $true
$request.AllowAutoRedirect = $false
$request.Method = "POST"
$request.ContentType = "application/json"
$request.Accept = "application/json"
$utf8Bytes = [System.Text.Encoding]::UTF8.GetBytes($JSON)
$request.ContentLength = $utf8Bytes.Length
$postStream = $request.GetRequestStream()
$postStream.Write($utf8Bytes, 0, $utf8Bytes.Length)
#Write-String -stream $postStream -string $JSON
$postStream.Dispose()
try
{
#[System.Net.HttpWebResponse] $response = [System.Net.HttpWebResponse] $request.GetResponse()
$response = $request.GetResponse()
}
catch
{
$response = $Error[0].Exception.InnerException.Response;
Throw "Exception occurred in $($MyInvocation.MyCommand): `n$($_.Exception.Message)"
}
$reader = [IO.StreamReader] $response.GetResponseStream()
$output = $reader.ReadToEnd()
$reader.Close()
$response.Close()
Write-Output $output
}
catch
{
$output = @"
{
"error":1,
"error_desc":"Error : Problème d'accès au serveur $($_.Exception.Message)"
}
"@
Write-Output $output
}
}
Отредактировано 19-10-2015
Вот пример использования :
#$urlBase = "http://192.168.1.1:8080/"
#######################################################################
# Login #
#######################################################################
$wsLogin = "production/login"
Function login
{
[CmdletBinding()]
PARAM
(
[ValidateNotNullOrEmpty()]
[String] $login,
[String] $passwd
)
Write-Verbose $wsLogin
#$jsonIn = [PSCustomObject]@{"login"=$login;"passwd"=$passwd} | ConvertTo-Json
$jsonIn = @"
{
"login":"$login",
"passwd":"$passwd"
}
"@
Write-Verbose $jsonIn
$jsonOut = Request-Rest -URL "$urlBase$wsLogin" -JSON $jsonIn -credentials $null
Write-Verbose $jsonOut
#return $jsonOut | ConvertFrom-Json
return $jsonOut
}
Комментарии:
1. @JBlanc, можешь привести пример JSON?
Ответ №2:
Этот код легко преобразовать в cURL
curl -v —небезопасный -X POST -H «Content-Type: application/ json» —двоичный файл данных someJSONFile.js https://coolWebsite.com/ext/ext /