你應該立刻放下curl,拿起httpie來高效幹活

背景

本文作者長期從事微服務開發,在實踐中,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

解疑

  1. 當使用環境變量時,無法正常使用,如:
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語言等)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章