通常我會使用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,真的太方便了。