1. 程式人生 > >你應該立刻放下curl,拿起httpie來高效幹活

你應該立刻放下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語言等)

相關推薦

應該立刻放下curlhttpie高效幹活

背景 本文作者長期從事微服務開發,在實踐中,httpie給我提效不少。 如果你還在使用curl,那麼這篇文章就是給你的。 python有一個給人類使用的requests庫,非常的簡單方便。httpie就是基於requests開發的,給人類用的命令列工具,取

放下2018 2019

       2018匆匆而逝,感謝生活,感謝身邊的每一個人,讓我學會了很多,懂得了很多,這是一個有意思的一年。        人這一生,有些人,不可避免,你總會遇到,他會給你上一段時間的課,就會從你的路上離開,而我,在今年也遇

在右側我們給出了一個已經基本完成的程式讀入了一個字串呼叫了一個叫str_len的函式計算這個字串的長度並輸出。 聰明的應該已經發現了這個叫str_len的函式並沒有完成

在右側我們給出了一個已經基本完成的程式,讀入了一個字串,呼叫了一個叫str_len的函式來計算這個字串的長度,並輸出。 聰明的你應該已經發現了,這個叫str_len的函式並沒有完成,在不修改函式原型的情況下,請完成str_len函式,實現我們上述的功能吧。 樣例輸入 複製 abc

面試沒想象中的難Offer也可以很輕鬆

前言 首先祝大家端午節安康! 大概在一個月前就已經打算寫一篇關於我三月份面試的一個總結了,但由於沒有時間在加上還沒有想好該怎麼寫,所以一直沒有寫。適逢端午佳節,有了一段相對較長的時間可以理理所以決定下筆。 正如標題所說:目前我是一名安卓實習生,現在

基礎的 mysql sql 語句簡單篇就用

<?php // mysql 資料庫常用 sql 常用語句記錄(主要是自己忘性大) /***************************************** * 數 * 據 * 庫 * 操 * 作 **************

防火墻導致zookeeper集群異常kafka

AR environ art ssi 防火 conn 順序 exc 啟動 問題描述: 主機信息: IP hostname 10.0.0.10 host10 10.0.0.12 host12 10.0.0.13 host13 在這三臺主機上部署一套

零基礎學python北京培訓告訴應該從哪學

這是一門神奇的語言,不同於以往從c\c++ 需要自己編寫各種賦值,各種程式碼的編寫,python在所有語言中Python的抽象程度是較高的,是較接近自然語言的,非常容易上手,Python 可以讓你更好的理解程式設計這件事情。 Python的優點有太多 1.未來智慧:自從阿爾法狗戰勝

當問執行緒池(Java中的ThreadPoolExecutor類)應該知道的基礎知識點

執行緒池 執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後自動啟動這些任務。執行緒池執行緒都是後臺執行緒。每個執行緒都使用預設的堆疊大小,以預設的優先順序執行,並處於多執行緒單元中。如果某個執行緒在託管程式碼中空閒(如正在等待某個事件),則執行緒池將插入另一個輔助執

萬字長文教Python防禦特朗普的Twitter殺傷力!

可視化 過度 第一個 新頁面 val ase fin 響應 cap 新智元推薦 來源:量化投資與機器學習 作者:Ali Alavi、Yumi、Sara Robinson 編輯整理:元子 【新智元導讀】通過對特朗普推文進行NLP分析、打標簽、可視化,讀者不僅僅能夠對

就算不是電商應該的電商朋友好好看看這篇文章

size gin 屬性 set 朋友 sdn 商務 通過 每天 典型案例場景:電商客服&倉庫協作管理用戶:天貓電商賣家-米詩緹娜客服-倉庫協作管理作為當今時代通過互聯網進行商品交易的電商服務,絕佳的購物體驗與完好的售後服務直接決定了其品牌價值。比起傳統的實體店來

關於雲計算雲服務是什麽?我想應該懂了!

自己 get 客戶 我想 遊戲 個人 gcs 均衡 軟件部署 雲計算很火,大家都在談論雲計算,在IT界混的沒有不知道雲計算的,懂的不懂的都說雲計算是未來的趨勢,大企業小廠商都去搞雲計算,可是雲計算是什麽?它能為我們帶來什麽好處?小編覺得雲計算就是一種服務,按需使用按量付費,

關於 Token應該知道的十件事

敏感信息 you load 冒充 tro hex 服務器 xhr cors 轉自:http://ju.outofmemory.cn/entry/134189 原文是一篇很好的講述 Token 在 Web 應用中使用的文章,而這是我和 Special 合作翻譯的譯文。 1.

做網站SEO優化這些網絡引流方法應該知道

尋求 可能 垃圾郵件 百度搜 如果 什麽 網站鏈接 很快 建立 對於網站SEO優化來說,網站流量的重要性不言而喻!國內的站長平臺工具通過用網站流量來衡量一個網站的權重,當你的網站流量很高的時候,同時會影響你網站的權重,進而影響你網站SEO優化排名。所以說流量對於一個網站的意

[轉]Redis實現緩存應該懂的哪些思路!

校驗 mem img /etc 元素 內存 大小 cfb bre 場景一:類似於微博,實現關註和被關註功能。 思路: 對每個用戶使用兩個集合類型鍵,用來存儲關註別人的用戶和被該用戶關註的用戶。當用戶A關註用戶B的時候,執行兩步操作: sadd user:A B sadd u

FTP的主動模式和被動模式應該用那種?

FTP 原理 主動模式 被動模式 FTP文件傳輸分為兩種模式,主動(PORT)模式和被動(Passive)模式,用戶應該用哪種? - 簡單粗暴,直接上答案 1)如果不是必須需要,不要使用FTP服務,主動/被動模式,命令/數據端口,初學者很容易一下子就被搞蒙。 2)如果一定要使用FTP服務,

去BAT應該要看一看的面試經驗總結

沖突 編譯器 地方 源碼 也會 ive l數據庫 udp 做的 我去年12月份從上一家公司離職,一直到今年3月份,基本上都在面試中度過來的。 先交代下背景:坐標上海,做技術開發,我本人面試的職位是linux服務器開發,最傾向的職位是服務器開發主程或技術經理。我本人也是上幾家

Java調用存儲過程應該好好了解一下

text bbc call sele python 詳細 關註 ural -o 存儲過程是指保存在數據庫並在數據庫端執行的程序。你可以使用特殊的語法在Java類中調用存儲過程。在調用時,存儲過程的名稱及指定的參數通過JDBC連接發送給DBMS,執行存儲過程並通過連接(如果有

Select 使用不當引發的core應該知道的

retcode 代碼 async fetch sse com 基礎 -a cnblogs 排查一個死機問題,搞了好幾天時間,最終確定原因;最終確定問題原因,在此分享一下; 第一步:常規根據core文件查看棧信息,gdb –c core xxxx 如下rip不正確,指令地址錯

那個說程序員就應該加班的HR我有一萬句MMP想對

不相信 現在 包括 獲得 的人 小夥伴 朋友 朋友圈 研發 先說我的觀點:程序員工資高,是因為有能力,而不是會加班! 事情是這樣~~~ 這幾天我公司研發部的小夥伴連續好幾天加班到很晚,我在他們工位後面看著他們疲憊的身影,心中五味雜陳。 於是,我在朋友圈感慨了一句: 其他部門

關於分散式儲存這是應該知道的(圖文詳解)(關於儲存的一些好文轉載--1)

轉自:http://stor.51cto.com/art/201711/556946.htm 關於分散式儲存,這是你應該知道的(圖文詳解) 前言 分散式儲存存在的風險,其實就是因為“共享”、“大資料量”、“高效能”和X86伺服器+廉價的磁碟為載體之間的矛盾所產生的,不是有些讀者說的“資料