使用powershell的Invoke-RestMethod呼叫REST API

 通常我會使用Postman或curl來測試REST API,不過這兩個工具都需要額外安裝。

今天在學習powershell時,想到強大的powershell是否也能直接呼叫REST API,查了一下果然可以,所以記錄一下。

利用Invoke-RestMethod就可以很方便使用REST API,對於寫Script或測試http service都很方便。


GET測試,我的語法如下,要注意的是下列語法是同一行,只是用「`」來分行:

Invoke-RestMethod 'http://192.192.192.10:8587/ords/ords_test/demo04/temp' `
    -Method 'GET' `
    -Headers @{ "Content-Type" = "application/json"; }


成功傳回資料,但是由上圖可知顯示的格式是已經分析response的json,而且如果資料過長,就會被截斷如下圖


可以加上ConvertTo-Json,顯示JSON的原貌

Invoke-RestMethod 'http://192.192.192.10:8587/ords/ords_test/demo04/temp' `
    -Method 'GET' `
    -Headers @{ "Content-Type" = "application/json"; } `
    | ConvertTo-Json


POST測試,要request的json如右:{"name"="9527"; "job"="長工"},我的語法如下:

Invoke-RestMethod 'http://192.192.192.10:8587/ords/ords_test/demo02/plsql01' `
    -Method 'POST' `
    -Headers @{ "Content-Type" = "application/json" } `
    -Body ((@{"name"="9527"; "job"="長工"})|ConvertTo-Json)


要注意的是-Body這一行,除了利用管線「|」來轉成json之外,其括弧()也是不可以省略的,也可以用變數的方式來取代

$DATA = @{"name"="9527"; "job"="長工"}

Body的值改為-Body ($DATA|ConvertTo-Json)

此外,因為json上有中文字,所以還需要針對中文來進行編碼,以免變成亂碼,所以修正後的語法如下:

Invoke-RestMethod 'http://192.192.192.10:8587/ords/ords_test/demo02/plsql01' `
    -Method 'POST' `
    -Headers @{ "Content-Type" = "application/json";"charset"="utf-8" } `
    -Body ([System.Text.Encoding]::UTF8.GetBytes(((@{"name"="9527"; "job"="長工"})|ConvertTo-Json)))

如果是比較複雜的json,範例如下

{
    "site": "test",
    "List": [
        "A1",
        "A2"]
}

可以寫成:

$BODY_DATA = @{
    "site" = "test" ;
    "List" = @(
        "A1",
        "A2") 
}

實際測試結果如下圖:


POST測試2

這次是用form來request資料,不過因為目前我只有json的api,所以就先記錄一下。

檔案的部份用get-item來取得,其語法如下:

$Form = @{
    Name  = "A001"
    photo = Get-Item -Path 'd:\test.png'
}

$Result = Invoke-RestMethod -Uri "http://test.com" -Method Post -Form $Form


利用Windows內建的powershell就可以測試API,真的太方便了。