C#で書くふりをしますが、Powershellでのみです



Powershellは、.net上に構築された便利なAPIです。Powershellを使用すると、ユーザーはプログラミングを必要とせずにスクリプトを記述しながら、同様の結果を得ることができます。KDVPで何が起こるか、著者はテキストの後半で説明します。今、私たちはC#でプログラミングしているふりをする必要があります。



TL; DR:Powershellが利用可能な場合、Postmanは必要ありません。しかし、最初にあなたは遠くから行く必要があります。



簡単なクラスを作る



かっこいいプログラマーは、クラスとそのメソッドを通じてすべてを行うと聞きました。

PowerShellで許可されているので、プログラミングのふりをしながら1 +1を追加する方法を紹介します。



class ClassName {
 
    [string] Sum ($A, $B) {
       
        $Result = $A + $B
        return $Result
    }
}


これがClassNameクラスとそのSumメソッドです。クラスのインスタンスは、実際のプログラミング言語とまったく同じ方法で呼び出すことができます。



$NewClass = [ClassName]::new()
$NewClass.Sum(1, 1)


クラスの新しいインスタンスを作成し、メソッドを呼び出します。すべてが簡単です。



PowershellにVoidはありますか



複雑なスクリプトを書くとき、同じ質問が著者から生じました。Voidになる関数を作成するにはどうすればよいですか?



彼らはあなたがこれを行うことができると言います:



Get-Date | Out-Null


ただし、| Out-Nullは、すべてのVerbose、ErrorActionも抑制し、Invoke-Commandでは機能しません。



[Void]を使用した関数が必要な場合-新しいクラスを作成します。他に方法はありません。



class ClassName {
 
    # 
    [void] Start () {
        #       .
        $q = [ClassName]::new()
        $q.GetDate()
    }
 
    #    
    [void] GetDate () {
        #        .Net
	  # ,   
        $Result = [DateTime]::UtcNow.ToString()
        Write-Host $Result
    }
}


1つのクラス内でメソッドをプライベートにしたり、PowerShellの同じクラス内でクラスメソッドの1つを呼び出したりすることは不可能であるため、そのような呼び出しをスカルプトする必要があります。

言語の制限を理解するためにクラスコンストラクターが例に追加されました。そのようなコードは一般的に記述されるべきではありません。



これが、Voidで関数を作成しながら、Verboseの溺死を回避する方法です。



クラスメソッドのリスト



おそらくあなたが知らない言語でさえ、あなたがプログラムを作る必要があるとしましょう。クラスがあることは知っていますが、そのメソッドは十分に文書化されていません。



対象のクラスのすべてのメソッドを次のようにリストできます。



# ,   
$Love = [ClassName]::new()
 
#        .
foreach ($i in $Love | Get-Member -MemberType Method | Select-Object name) {
    [array]$array += $i.Name
}
 
#  ,  .
$Array | ForEach-Object {
    $Love.$_()
}


スクリプトを使用してHTTPリクエストを送信します(KDPVを正当化します)



クラスを使用すると、データを表現し、このデータをさまざまな形式に変換できます。たとえば、POSTリクエストをJSON形式でWebサイトに送信する必要があります。



まず、データモデルを作成し、データを新しいインスタンスに入力します。



#      
class DataModel {
    $Data
    $TimeStamp
}
 
#  
$i = [DataModel]::new()
 
# 
$i.Data = "My Message in string"
$i.TimeStamp = Get-Date


これは、入力後のクラスインスタンスの外観です。



PS C:\> $i
 
Data                 TimeStamp
----                 ---------
My Message in string 30.07.2020 5:51:56


次に、このインスタンスをXMLまたはJSON、さらにはSQLクエリに変換できます。JSONについて詳しく見ていきましょう。



#   JSON
$Request = $i | ConvertTo-Json


これは、JSONを変換した後の外観です。



PS C:\> $Request
{
  "Data": "My Message in string",
  "TimeStamp": "2020-07-30T05:51:56.6588729+03:00"
}


そして、私たちは送信します:



# JSON
Invoke-WebRequest localhost -Body $Request -Method Post -UseBasicParsing


同じJSONファイルを24時間年中無休で送信する必要がある場合は、ファイルとして保存し、ファイルから送信できます。たとえば、これと同じ$リクエストを考えてみましょう。



#     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


スクリプトでHTTPリクエストを受信します(KDPV 2を正当化します)



著者はPostmanを嫌っていますが、手とPowerShellがあれば、なぜPostmanが必要になるのでしょうか。(作成者はこのプログラムに偏っており、彼の嫌いは根拠

がありません。)System.Net.HttpListenerを使用して代替を行いますつまり、スクリプトから実際のWebサーバーを起動します。



#   
$http = [System.Net.HttpListener]::new()
 
# HTTP .     
$http.Prefixes.Add("http:/localhost/")
$http.Prefixes.Add("http://127.0.0.1/")
 
#  
$http.Start()
 
 
$http.Close()


これがクラスの始まりです。



クラスのインスタンスが作成され、そのプロセスが開始されました。その出力を聞くことができます。出力はSystem.Net.HttpListener.GetContextとして表示されます。この例では、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
           
        }
    }
} 


レディスクリプト



このスクリプトを使用すると、リクエストを受け入れることができます。



#   
$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
}


データは自動的にJSONから変換され、端末に出力されます。



著者は、あなたがPostmanと、GUIを備えたGITを捨てることを望んでいます。






All Articles