Home > Windows にまつわる e.t.c.

PowerShell で Web API をハンドリングする


Web API と言うと、ざっくり分けて REST API と SOAP API の2種類になるのですが、世の中で言う Web API はほぼ REST API だと思います(個人的感覚ですけど)

PowerShell は REST も SOAP も両方使えるので、REST API の一般的なハンドリング方法を解説します
(以降 API は REST API と読み替えて下さい)

SOAP は末尾に解説しているリンクを張っていますので、そちらからどうぞ

API の動作を確認したい場合、Web サービスであれば Postman が有名ですが、Web UI をチマチマ操作するのも面倒なので、僕はもっぱら PowerShell を使っています

大量の引数も、PowerShell であればテキストエディタや VS Code で書けば良いので効率よくテスト出来ます

Windows PowerShell でも、マルチプラットフォームの PowerShell のどちらでもテストできるので、ちょっとしたコツがわかれば、結構便利に使えます

 

API のパラメーター

API で使用する重要なバラメーターは以下となります

パラメーター 意味
エンドポイント API を受け取る URL https://api.example.com/customer/regist
メソッド API の動作 GET POST
ヘッダー 認証情報の格納場所 App_ID App_Secret
ボディ リクエストパラメーター本体 後述
ContentType データ形式 application/json

 

これを PowerShell でハンドリングするにはハッシュテーブル形式で以下のように書きます

 

ヘッダー

認証情報として、ヘッダーに app_id と app_secret をセットするのであれば、以下のように書きます

# ヘッダー
$headers = @{
    app_id = '01249faf-21ec-49d7-8a08-f1bb9d3607f5'
    app_secret = '3e00270e-cb6a-4d62-84e8-a7e0ba7ab23a'
}

 

ボディ

API リクエストの本体で、こんな感じで書きます

# リクエストパラメーター
$body = @{
    last_name = '海野'
    first_name = '博'
    last_name_kana = 'ウミノ'
    first_name_kana = 'ヒロシ'
    email = 'h.umino@example.com'
    gender_id = '1'
}

 

API は UTF-8 で送る必要があるので、ボディを UTF-8 にエンコードします

日本語が含まれている場合は、UTF-8 にエンコードが必須ですが、API によっては日本語が含まれていない場合でも UTF-8 にエンコードしないとエラーになるケースがあるので、ボディは UTF-8 にエンコードの呪文をかけると思っておいた方が余計なエラーに悩まされなくて良いかと思います
(トキトギ忘れてヤラカスのはナイショ w)

# UTF-8 にエンコードする
$JsonData = $body | ConvertTo-Json
$SendJson = [System.Text.Encoding]::UTF8.GetBytes($JsonData)

 

エンドポイント/メソッド/ContentType

エンドポイントとメソッド、ContentTypeは Invoke-RestMethod コマンドレットのオプションとして指定します

エンドポイントは、API を受け付ける URL なので、API 説明書で指定されているか、API 提供者から情報提供されます

メソッドは、使用する API ごとに決まっているので、API 説明書で指定されているメソッドを指定します

ContentTypeは、データタイプです
REST API は、json でリクエストパラメーターを記述するので「application/json」をしています
エラーになる場合は、この指定を外してみるとエラーが起きなくなる事があります

 

API を叩く

では、Invoke-RestMethod で API の叩き方です

# API を叩く
$Response = Invoke-RestMethod -Method Post -Uri $URL 'https://api.example.com/customer/regist' -Body $SendJson -Headers $headers -ContentType 'application/json'

 

API の実行結果は「status」にステータスが、「data」に戻り値が格納されているので、以下のように分解すると良いでしょう

$Status = $Response.status
$Data = $Response.data

 

まとめ

一連のスクリプトをまとめると以下のようになります

# ヘッダー
$headers = @{
    app_id = '01249faf-21ec-49d7-8a08-f1bb9d3607f5'
    app_secret = '3e00270e-cb6a-4d62-84e8-a7e0ba7ab23a'
}

# リクエストパラメーター
$body = @{
    last_name = '海野'
    first_name = '博'
    last_name_kana = 'ウミノ'
    first_name_kana = 'ヒロシ'
    email = 'h.umino@example.com'
    gender_id = '1'
}

# UTF-8 にエンコードする
$JsonData = $body | ConvertTo-Json
$SendJson = [System.Text.Encoding]::UTF8.GetBytes($JsonData)

# API を叩く
$Response = Invoke-RestMethod -Method Post -Uri $URL 'https://api.example.com/customer/regist' -Body $SendJson -Headers $headers -ContentType 'application/json'

$Status = $Response.status
$Data = $Response.data

 

こいつを PowerShell プロンプトにコピペするか、.ps1 に書いてやれば API を簡単に叩くことが出来ます

 

参考情報

SOAP の PowerShell ハンドリング
https://www.vwnet.jp/windows/PowerShell/2018042401/SOAPbyPowerShell.htm

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.