
O Powershell é uma API útil construída em .net. O Powershell permite que os usuários escrevam scripts sem a necessidade de programação, obtendo resultados semelhantes. O que acontece no KDVP, o autor explicará mais adiante no texto. Agora precisamos fingir urgentemente que estamos programando em C #.
TL; DR: Postman não é necessário se o Powershell estiver disponível. Mas primeiro você precisa ir de longe.
Fazendo uma aula simples
Ouvi dizer que programadores legais fazem tudo por meio de classes e seus métodos.
Como o PowerShell permite, deixe-me mostrar como você pode adicionar 1 + 1 enquanto finge estar programando.
class ClassName {
[string] Sum ($A, $B) {
$Result = $A + $B
return $Result
}
}
Aqui está nossa classe ClassName e seu método Sum. Uma instância de uma classe pode ser chamada exatamente da mesma maneira que em linguagens de programação reais.
$NewClass = [ClassName]::new()
$NewClass.Sum(1, 1)
Criamos uma nova instância da classe e chamamos o método, tudo é simples.
Existe um vazio no Powershell
Ao escrever scripts complexos, a mesma pergunta surgiu do autor. Como faço uma função que será anulada?
Eles dizem que você pode fazer isso:
Get-Date | Out-Null
No entanto, | Out-Null também suprime todas as Verbose, ErrorAction e não funciona com Invoke-Command.
Se você precisa de uma função com [Void] - faça uma nova classe, não há outra saída.
class ClassName {
#
[void] Start () {
# .
$q = [ClassName]::new()
$q.GetDate()
}
#
[void] GetDate () {
# .Net
# ,
$Result = [DateTime]::UtcNow.ToString()
Write-Host $Result
}
}
É impossível tornar um método privado dentro de uma classe ou chamar um dos métodos de classe dentro da mesma classe no PowerShell, então você deve esculpir essas chamadas.
Um construtor de classe foi adicionado ao exemplo para entender as limitações da linguagem, e esse código não deve ser geralmente escrito.
Assim conseguimos que não nos afogássemos em Verboso, ao fazer uma função com Vazio.
Lista de métodos de classe
Digamos que você precise fazer um programa, talvez até em uma linguagem que não conhece. Você sabe que existe uma classe, mas seus métodos são mal documentados.
Você pode listar todos os métodos da classe de interesse da seguinte maneira:
# ,
$Love = [ClassName]::new()
# .
foreach ($i in $Love | Get-Member -MemberType Method | Select-Object name) {
[array]$array += $i.Name
}
# , .
$Array | ForEach-Object {
$Love.$_()
}
Enviamos solicitações HTTP com um script (justificamos KDPV)
Com classes, podemos representar dados e converter esses dados em formatos diferentes. Por exemplo, precisamos enviar uma solicitação POST a um site no formato JSON.
Primeiro, criamos um modelo de dados e preenchemos os dados em uma nova instância.
#
class DataModel {
$Data
$TimeStamp
}
#
$i = [DataModel]::new()
#
$i.Data = "My Message in string"
$i.TimeStamp = Get-Date
Esta é a aparência da instância da classe após o preenchimento:
PS C:\> $i
Data TimeStamp
---- ---------
My Message in string 30.07.2020 5:51:56
Então, essa instância pode ser convertida para XML ou JSON ou até mesmo uma consulta SQL. Vamos nos concentrar em JSON:
# JSON
$Request = $i | ConvertTo-Json
Esta é a aparência do JSON depois de convertido:
PS C:\> $Request
{
"Data": "My Message in string",
"TimeStamp": "2020-07-30T05:51:56.6588729+03:00"
}
E enviamos:
# JSON
Invoke-WebRequest localhost -Body $Request -Method Post -UseBasicParsing
Se precisar enviar o mesmo arquivo JSON 24 horas por dia, 7 dias por semana, você pode salvá-lo como um arquivo e enviá-lo a partir do arquivo. Por exemplo, vamos pegar este mesmo $ Request.
# JSON
$Request | Set-Content C:\Users\User\Desktop\YourRequest.json
# JSON
Invoke-WebRequest localhost -Body (Get-Content C:\Users\User\Desktop\YourRequest.json) -Method Post -UseBasicParsing
Recebemos solicitações HTTP com um script (justificamos KDPV 2)
O autor odeia Postman, por que alguém precisaria do Postman se eles têm mãos e PowerShell? (O autor é inclinado a este programa e sua antipatia não é justificada por nada.)
Faremos nossa alternativa usando System.Net.HttpListener, ou seja, agora iniciaremos um servidor web real a partir de um script.
#
$http = [System.Net.HttpListener]::new()
# HTTP .
$http.Prefixes.Add("http:/localhost/")
$http.Prefixes.Add("http://127.0.0.1/")
#
$http.Start()
$http.Close()
É assim que a aula começa.
Uma instância da classe foi criada e seu processo iniciado, podemos ouvir sua saída. A saída é apresentada como System.Net.HttpListener.GetContext. Neste exemplo, aceitamos e convertemos apenas uma solicitação POST.
while ($http.IsListening) {
#GetContext HttpListener
$context = $http.GetContext()
# Request.HttpMethod
if ($context.Request.HttpMethod -eq 'POST') {
# GetContext
#
[System.IO.StreamReader]::new($context.Request.InputStream).ReadToEnd() | ForEach-Object {
# System.Web.HttpUtility urlDecore,
$DecodedContent = [System.Web.HttpUtility]::UrlDecode($_)
#
$ConvertedForm = $DecodedContent | ConvertFrom-Json -ErrorAction SilentlyContinue
#C
$ConvertedForm | Format-Table
}
}
}
Roteiro pronto
Com este script, você pode aceitar solicitações:
#
$http = [System.Net.HttpListener]::new()
# HTTP .
$http.Prefixes.Add("http://localhost/")
$http.Prefixes.Add("http://127.0.0.1/")
#
$http.Start()
if ($http.IsListening) {
Write-Host " "
}
while ($http.IsListening) {
#GetContext HttpListener
$context = $http.GetContext()
# Request.HttpMethod
if ($context.Request.HttpMethod -eq 'POST') {
# GetContext
#
[System.IO.StreamReader]::new($context.Request.InputStream).ReadToEnd() | ForEach-Object {
# System.Web.HttpUtility urlDecore,
$DecodedContent = [System.Web.HttpUtility]::UrlDecode($_)
#
$ConvertedForm = $DecodedContent | ConvertFrom-Json -ErrorAction SilentlyContinue
#C
$ConvertedForm | Format-Table
}
# 200 OK .
$context.Response.Headers.Add("Content-Type", "text/plain")
$context.Response.StatusCode = 200
$ResponseBuffer = [System.Text.Encoding]::UTF8.GetBytes("")
$context.Response.ContentLength64 = $ResponseBuffer.Length
$context.Response.OutputStream.Write($ResponseBuffer, 0, $ResponseBuffer.Length)
$context.Response.Close()
}
#C
$http.Close()
break
}
Os dados serão convertidos automaticamente de JSON e enviados para o terminal.
O autor espera que você jogue fora o Postman, assim como o GIT com uma GUI.
