curl 如何用 https 協定 post json 資料

使用 curl 來做 GET/POST/DELETE 已經是非常普遍的行為了,就連 slack 裡的範例用的全都是 curl,雖然用 postman 測試也很方便,但使用 slack 範例程式可以直接 copy paste 直接使用爽度更高

curl 的好處是免安裝,怎麼下載怎麼設定到系統路徑與怎麼使用這邊就不講了

slack webhook 裡面有一個範例程式是用 curl 可以直接測試

curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/[slack auto gen path]


眼見是一個再容易不過的事情,沒想到遇到這個錯誤
curl: (6) Could not resolve host: application
invalid_payload

同時用一樣的資料在 postman 卻可以正常執行 post 到 slack 去

很明顯應當是 payload 方面的問題,但使用 fiddler 擷取封包需要先開啟 https 的設定,可參考這篇

接著要擷取 curl 的封包的時候卻發現什麼都抓不到

原來是 curl 需要指定 local proxy 才能抓的到

curl -x 127.0.0.1:8888 -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/[slack auto gen path]

接著卻又噴了 certifate 的奇怪問題
curl: (35) schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - The revocation function was unable to check revocation for the certificate.

google 了一下,才發現 curl 要再往這邊加上一個 ssl-no-revoke 的設定

curl --ssl-no-revoke -x 127.0.0.1:8888 -X POST -H "Content-type: application/json"  -d "{"text":"hello"}" https://hooks.slack.com/services/[slack auto gen path]


好不容終於在 fiddler 中錄到了,但比對了資料格式卻跟 postman 有所出入,看起來是資料連 json 都不是,最重要的雙引號都不見了
直接就是我們的文字 '{text:Hello, World!}'

也許 slack 裡的範例並不是給 windows 使用,亦或是有其他設定需要更動吧

於是我決定把資料的格式全部使用雙引號處理,這時遇到最後一個問題是跳脫字元的問題,在 json 我們可以加上 \ 來做處理,最後的格式就會長成這樣

curl --ssl-no-revoke -x 127.0.0.1:8888 -X POST -H "Content-type: application/json"  -d "{\"text\":\"hello\"}" https://hooks.slack.com/services/[slack auto gen path]

一個簡單的測試卻沒想到是峰迴路轉

參考資料
https://curl.haxx.se/download.html
https://stackoverflow.com/a/56486639
https://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/FirefoxHTTPS