呼叫 HTTP 請求對開發者來說是非常稀鬆平常的,使用 PowerShell 來發送 HTTP 請求官方提供了兩種 CmdletInvoke-WebRequestInvoke-RestMethod,前者主要用於想要取得 HTML 網頁內容,後者的使用情境偏向呼叫 Web API,這裡介紹一下我們可以怎麼使用 Invoke-RestMethod

這篇文章程式碼使用 Postman TODO LIST API 當作呼叫端點。

呼叫一個 Web API 基本上有 4 要素,端點(Endpoint)、動作(HTTP Method)、標頭(HTTP Header)、內容(HTTP Body),如果只是單純呼叫的動作,可以參考下面的程式碼:

Invoke-RestMethod 'https://api-nodejs-todolist.herokuapp.com/user/login' `
    -Method 'POST' `
    -Headers @{ "Content-Type" = "application/json"; } `
    -Body "{`"email`": `"muh.nurali43@gmail.com`",`"password`": `"12345678`"}"

這邊注意到兩個地方,第一個是 Header 的參數使用 PowerShell 匿名物件的方式來提供,第二是 Body 的參數是用字串的方式來提供,當然你也可以都用匿名物件的方式來做,只是 Body 的參數要記得轉成 JSON 字串就是了,請參考下列做法:

Invoke-RestMethod 'https://api-nodejs-todolist.herokuapp.com/user/login' `
    -Method 'POST' `
    -Headers @{ "Content-Type" = "application/json"; } `
    -Body (@{"email" = "muh.nurali43@gmail.com"; "password" = "12345678"; } | ConvertTo-Json)

你會發現上面所得到的結果,其實沒有那麼好閱讀,長的會像這樣:

呼叫 Web API 後,使用 PowerShell 輸出物件資訊的樣式

這是 PowerShell 輸出物件資訊的標準樣式,這樣的顯示方式很容易把後半段的資訊截斷,所以這裡建議,如果要查看呼叫 Web API 所拿到的回應 JSON 資料,可以使用 | 管線號,配上一個剛剛我們其實已經有用到的 Cmdlet ConvertTo-Json

Invoke-RestMethod 'https://api-nodejs-todolist.herokuapp.com/user/login' `
    -Method 'POST' `
    -Headers @{ "Content-Type" = "application/json"; } `
    -Body (@{"email" = "muh.nurali43@gmail.com"; "password" = "12345678"; } | ConvertTo-Json)
| ConvertTo-Json

這樣的輸出結果,就比較容易閱讀了:

使用 ConvertTo-Json 格式化呼叫 Web API 後的回應結果

我通常這樣寫

有時候程式會比較複雜,會需要很多地方彈性調整,所以通常我會用下面這樣的寫法:

try {
    $EndPoint = "https://api-nodejs-todolist.herokuapp.com/user/login"
    $Headers = @{ 'Content-Type' = 'application/json'; }
    $Body = (@{"email" = "muh.nurali43@gmail.com"; "password" = "12345678"; } | ConvertTo-Json)
    $Response = Invoke-RestMethod $EndPoint -Method 'POST' -Headers $Headers -Body $Body
    Write-Output $Response | ConvertTo-Json
}
catch {
    Write-Output $Error[0]
}

基本上和上面提到的使用方式都一樣,但這裡加上 try...catch 來捕捉例外,捕捉到的例外錯誤訊息會被加到 PowerShell 的 $Error 變數中,幫助我們更快速的調查是哪裡發生錯誤。

關於更多 try...catch 捕捉錯誤訊息,以及什麼資訊會存放進 $Error 變數中,請參考這篇文章


參考資料:


Poy Chang

Trial and Error