背景
本文作者長期從事微服務開發,在實踐中,httpie給我提效不少。
如果你還在使用curl,那麼這篇文章就是給你的。
python有一個給人類使用的requests庫,非常的簡單方便。httpie就是基於requests開發的,給人類用的命令行工具,取代curl的絕佳工具。
什麼叫“給人類用的”
經過長期的理解,我的總結如下:
給人類用的,需要滿足如下:
- 將常見場景、大概率行爲變成了默認值
- 只需人類輸入最核心的業務信息,多餘的語法格式由程序自己分析判斷
給機器用的,就是所有的行爲,不管是常見還是不常見的,都需要具體命令告知它。
最開始的技術,都是給機器用的。在長期的實踐中,人類出現了很多常見行爲或場景,將這些行爲、場景變成默認值等方式,可以在大概率場景中,節省人類的工作量。
參考資料
httpie應用精華
httpie VS curl
curl
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{ \
"send_type": "wechat", \
"to": [ \
"xn080xxx", \
], \
"content": "this is xxx alert" \
}' 'http://aaa.xxx.com/api/v1/alert'
http
http aaa.xxx.com/api/v1/alert send_type=tts to:='["xn080xxx"]' content="this is alert"
可以看到,http版本比curl簡單了很多,主要原因如下:
- 將常見場景、大概率行爲變成了默認值
- 只需人類輸入最核心的業務信息,多餘的語法格式由程序自己分析判斷
具體爲:
1. get和post是大概率行爲,人類執行get時,一般不帶request data,帶request data的基本都是post行爲。因此,httpie將這兩個常見大概率行爲變成默認值。—— 如果http命令不帶request data,默認行爲是get;如果帶了request data,默認行爲是post
2. 採用json交互基本是當今人類的最常見的場景,因此,header的兩個地方默認設置爲application/json,可以在大概率場景中節省人工輸入
3. json交互作爲大概率事件,簡化json數據輸入可以節省很多人工。curl採用json的raw的格式輸入,不是很高效。httpie用=代表request data,:代表header data,==代表query data,自動識別,無需呆板的完整定義各個數據體,將多餘的人工操作儘可能自動化
4. 字符串輸入是大概率行爲,因此字符串的賦值,無需雙引號,除非裏面有空格等特殊字符。將其他較小概率的數據類型採用:=進行輸入(raw格式,如整形數,數組)
5. 不加http://也是可以的,這是默認行爲
從以上分析可以看出,httpie將大概率的人工操作進行了簡化設計,因此,人工操作可以節省很多時間。
安裝
這麼好的東西趕緊安裝
pip install httpie
使用時,是用http ,不是httpie
再簡單一些
見下面這個常見指令,往一個https網站post一個json數據,而且需要認證。
http https://aaa.xxx.com/api/v1/alert send_type=tts to:='["xn080xxx"]' content="this is alert -a username:password"
簡化https
在你的~/.bashrc等類似文件加入:
alias https='http --default-scheme=https'
這樣,可以簡化爲:
https aaa.xxx.com/api/v1/alert send_type=tts to:='["xn080xxx"]' content="this is alert -a username:password"
這樣的alias非常方便,http和https非常形象直觀
簡化認證並隱藏密碼信息
session方法
第一次執行
https aaa.xxx.com/api/v1/alert send_type=tts to:='["xn080xxx"]' content="this is alert" -a username:password --session=your-session-name
這樣,就會產生一個session文件,裏面包含了header,認證,cookie等信息(默認在~/.httpie/sessions/your_url/your_sesssion_name裏)
以後執行,直接使用該session文件即可,無需再加-a username:password
https aaa.xxx.com/api/v1/alert send_type=tts to:='["xn080xxx"]' content="this is alert" --session=your-session-name
.netrc方法(更簡單)
在~/.netrc中加入
machine url_you_want_to_visit
login your_username
password your_password
這樣,程序會自動帶上這個認證,語句簡化爲:
https aaa.xxx.com/api/v1/alert send_type=tts to:='["xn080xxx"]' content="this is alert"
~/.netrc是一種通用方法,支持該文件的其他網絡操作都可以採用這種方法。
簡化json數據
我們會發現,在開發測試中,經常需要重複類似指令,能否把json數據也簡化輸入呢
簡化麻煩輸入的非字符串部分
上面的語句最麻煩,且經常記錯的就是 to:=’[“xn080xxx”]’,單引號,雙引號不能搞錯,最外面是單引號,裏面的元素是雙引號,我用了N多次,一段時間沒用就又容易忘記。
簡化它
httpie支持文件輸入
新增一個例如to.json文件,裏面內容
["xn080xxx"]
這樣,上面語句簡化爲:
https aaa.xxx.com/api/v1/alert send_type=tts to:[email protected] content="this is alert"
@後面跟的就是文件
全部數據來自文件(最簡單)
採用重定向即可
新增文件,例如send.json
{
"send_type": "tts",
"to": ["xn080xxx"],
"content": "this is alert"
}
上面語句簡化爲:
https aaa.xxx.com/api/v1/alert < send.json"
是的,這已經極其精簡了!
httpie在腳本中應用的注意事項
httpie在腳本中使用,需要注意幾點(易錯點):
http默認不理會返回的狀態碼,如果需要區分2xx,4xx等,需要加入 –check-status
https --check-status aaa.xxx.com/api/v1/alert < send.json"
這樣,當2XX返回時, echo $?得到是0;當4xx返回時,echo $? 得到的是4
in輸入管道的問題
這個坑被坑過,腳本中,in輸入管道被重定向,會被輸入一些數據,產生不可預料的行爲。
應該–ignore-stdin
例如:
https --check-status --ignore-stdin aaa.xxx.com/api/v1/alert < send.json"
課外:有趣的http-prompt
pip install http-prompt 後
你可以體驗用全新的理念來操作httpie的方法
http-prompt
解疑
- 當使用環境變量時,無法正常使用,如:
export phone=1862030xxxx
https aaa.xxx.com/api/v1/alert send_type=tts to:='["${phone}"]' content="this is alert"
解答
本質是單引號內的變量不會被正常解析,後端收到的to的value實際是${phone}。
單引號內如果需要解析變量,多加一層單引號即可,如下:
https aaa.xxx.com/api/v1/alert send_type=tts to:='["'${phone}'"]' content="this is alert"
實際上,如果shell有語法高亮,也會發現單引號裏面其實是不會翻譯變量的。
(提高:對於很多語言,也是遵循這個規則,單引號內的變量不翻譯,雙引號內才翻譯變量,例如groovy語言等)