這個命令行HTTP客戶端工具真不錯

程序員專屬微信紅包封面1000個,兌換碼:dWK7fUs2WQG

cURL相信很多做開發的、運維的都不陌生,是非常有用的一個終端請求工具,藉助於它可以在命令行中進行HTTPFTP等請求,在Linux系統中應用非常廣泛。但是它目前有一個缺陷,語法複雜,上手難度挺高的,甚至目前還不直接支持JSON參數請求。胖哥最近發現了另一個類似的工具httpie,一個非常簡單的HTTP命令行客戶端,甚至有點酷炫。

httpie

httpie是用Python寫的,支持的操作系統非常全面,上手非常快,胖哥看了5分鐘就能上手使用了。根據官方描述它的主要特點有:

  • 語法簡單
  • 支持格式化輸出和彩色樣式
  • WindowsLinux、MacOS都支持
  • 同時支持HTTPHTTPS
  • 支持文件上傳
  • 支持持續會話保持
  • 內置JSON支持,支持類似Wget下載
  • 支持插件

VS cURL

既然用來對標cURL,我們來直觀地看看它們之間的差異

HTTPie VS cURL

同一個的請求,cURL的參數項要多一些而且不能直觀理解,而httpie要人性化的多。

安裝

安裝方式這裏介紹四種。

PyPI

無視平臺,只要有Python3.7+環境即可。

# 安裝
pip install httpie

Windows

用以前胖哥推薦安裝的包管理器Chocolatey安裝。

# 安裝
choco install httpie
# 升級版本
choco upgrade httpie

MacOS

蘋果上應該沒有開發者不裝Homebrew的吧?

brew update
# 安裝
brew install httpie
# 升級版本
brew upgrade httpie

Linux

Linux可就多了,我們常用的Debian系,如Ubuntu

apt update
# 安裝
apt install httpie
# 升級版本
apt upgrade httpie

如果是紅帽系的話,自然是用yum

yum install epel-release
# 安裝
yum install httpie
# 升級版本
yum upgrade httpie

當然Fedora也可能有人喜歡用,用dnf命令試試,我不太確定。

用法

httpie用法很簡單,簡單到我懶得詳細寫說明,但是還是得寫一下。先來試試Hello World:

httpie命令的格式爲:

https|http [flags] [METHOD] URL [ITEM [ITEM]]

具體可以通過http --help查詢細節。

請求方法

httpie的請求方法(http method)是可選的,httpie會自行判斷。

http pie.dev/get

除非你顯式聲明:

http POST pie.dev/get

而下面這個方法會被認爲是POST請求:

http pie.dev/post hello=world

因爲hello=world會被認爲是請求體。那咋才認爲是GET呢?

即使顯式聲明爲GET也不行! **正確的做法是把=替換爲==

查詢字符串參數

爲什麼要=替換爲==?

https://api.github.com/search/repositories?q=httpie&per_page=1

上面是一個標準的API格式,在httpie中?&都被空格替換,參數也不需要URL轉義,query參數鍵值對使用==;請求體參數鍵值對使用=。變爲:

http https://api.github.com/search/repositories q==httpie per_page==1

用文件固定參數

有些配置項,比如JWT Token,老長老長了,而且我還想複用咋辦?寫文件裏,然後用@符號加路徑來引用文件裏的值:

http POST pie.dev/post \
    Authentication:@files/jwt.txt      # 從文件裏讀取請求頭
    token==@files/text.txt             # 從文件讀取query參數  
    name=@files/text.txt               # 請求體參數
    bookmarks:=@files/data.json        # 從文件中嵌入請求體json數據

這種方式我覺得把一些配置動態化了,改文件裏的值就可以了。

請求頭用的:

JSON

使用--json, -j顯式設置請求Acceptapplication/json,這個時候=連接的鍵值對會被轉爲json

http -j PUT pie.dev/put name=felord age=18   

驗證一下:

-v--verbose 的縮寫,可以打印請求細節。

如果不使用-j的話, 就需要使用:=來分隔鍵值對了,如果有文件引用還要加上@

http PUT pie.dev/put \
    name=John \                        # String (default)
    age:=29 \                          # Raw JSON — Number
    married:=false \                   # Raw JSON — Boolean
    hobbies:='["http", "pies"]' \      # Raw JSON — Array
    favorite:='{"tool": "HTTPie"}' \   # Raw JSON — Object
    bookmarks:=@files/data.json \      # Embed JSON file
    description=@files/text.txt        # Embed text file

實際請求體JSON爲:

{
    "age": 29,
    "bookmarks": {
        "httpie": {
            "says": "Hello, World!"
        }
    },
    "description": "Hello, World!\n",
    "favorite": {
        "tool": "HTTPie"
    },
    "hobbies": [
        "http",
        "pies"
    ],
    "married": false,
    "name": "John"
}

這時候=:=是一樣的。

嵌套

嵌套的格式也挺好理解的。我覺得不需要過多描述,看下面的圖就能明白。

一些技巧

只需要下面這種方式就可以快捷請求

# https://baidu.com
https ://baidu.com

如果是localhost,可以簡化爲:

# https://localhost:8080/yourapi
https :8080/yourapi

上傳下載:

http POST example.com/upload < ~/upload.pdf
http GET example.com/download.pdf > ~/download.pdf
# form 上傳
http -f POST example.com/form-with-file  myUpload@~/example.pdf

另外

另外還有代理、插件等高級玩法,可玩性非常強,需要自己去摸索摸索,基於篇幅就不在贅述了。httpie其實還有UI客戶端,只不過目前在β測試階段,沒開放申請。

關注公衆號:Felordcn 獲取更多資訊

個人博客:https://felord.cn

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