HTTPie 是一個命令列 HTTP 客戶端。目標是讓 CLI 與 Web services 的互動儘可能的更友好。它提供了一個簡單的 http
命令,可以讓我們用簡單自然的表述傳送任意 HTTP 請求,並且可以輸出帶程式碼高亮的結果。HTTPie 可以使用在測試、除錯以及通用的與 HTTP 互動場景
主要功能特性
- 自然而且簡單的命令語句
- 格式化且高亮顯示輸出內容
- 內建 JSON 支援
- 表單和檔案上傳
- 支援 HTTPS, 代理和授權驗證
- 支援多樣化的請求資料格式
- 自定義 headers 頭
- 持久 sessions 儲存
- 類似
wget
的下載模式 - 相容 Python 2.6, 2.7 以及 3.x
- 支援 Linux, macOS 和 Windows 作業系統
- 外掛支援
- 詳細的文件說明
- 完善的測試用例覆蓋
安裝
macOS
在 macOS 系統中推薦使用 Homebrew 來安裝:
brew install httpie
當然 MacPorts 也是可以的:
port install httpie
Linux
大多數的 Linux 構建版都提供了包管理元件,可以使用他們來安裝:
# 基於 Debian Linux 的構建版,比如 Ubuntu
apt-get install httpie
# 基於 RPM Linux 的構建版
yum install httpie
# Arch Linux 系統
pacman -S httpie
Windows 及其它
使用 pip 是一種通用的(可以使用在 Windows, MacOS, Linux …)並且提供最新版本安裝包的安裝方法
# 確保使用了最新版本的 pip 和 setuptools:
pip install --upgrade pip setuptools
pip install --upgrade httpie
開發版
最新的開發版本可以直接通過 github 安裝
# Homebrew
brew install httpie --HEAD
# pip
pip install --upgrade https://github.com/jkbrzt/httpie/archive/master.tar.gz
Python 版本
雖然相容 Python 2.6, 2.7 版本的,但是如果可以的話還是建議使用最新版的 Python 3.x 來安裝 HTTPie。這將保證一些比較新的功能(比如:SNI )可以開箱即用。Python 3 在 Homebrew 0.9.4 版本以上已經成為了預設的 Python 版本。可以使用 http --debug
來檢視 HTTPie 使用的 python 版本
使用
最簡單的使用:
http httpie.org
使用語法:
http [flags] [METHOD] URL [ITEM [ITEM]]
也可以使用 http --help
來檢視更多使用方法:
例子
自定義 HTTP 方法,HTTP 頭和 JSON 資料:
http PUT example.org X-API-Token:123 name=John
表單提交:
http -f POST example.org hello=World
使用一個輸出引數 -v
來檢視請求資訊(預設不顯示請求資訊):
http -v example.org
使用 Github API 向 issue 傳送一條評論(需要授權驗證引數):
http -a USERNAME POST https://api.github.com/repos/jkbrzt/httpie/issues/83/comments body=`HTTPie is awesome! :heart:`
通過命令列的輸入重定向上傳檔案:
http example.org < file.json
使用 wget
風格下載檔案:
http --download example.org/file
使用命令會話對同一 host 進行請求之間的持久通訊:
http --session=logged-in -a username:password httpbin.org/get API-Key:123
http --session=logged-in httpbin.org/headers
自定義請求 host 頭:
http localhost:8000 Host:example.com
HTTP 方法
HTTP 方法的名稱在 URL 引數之前:
http DELETE example.org/todos/7
這看起來就像是原生的 HTTP 請求傳送的文字一樣:
DELETE /todos/7 HTTP/1.1
請求 URL
HTTPie 唯一必傳的一個引數是請求 URL,預設的方案不出意料的是http://
,可以在請求的時候預設 – http example.org
是沒問題的
Querystring 引數
如果需要在命令列手動構建 URLs,你可能會覺得使用 param==value
新增引數的方式是比較方便的,這樣你就不需要擔心命令列中轉義連結字串 &
的問題,當然引數中的特殊字元也將被自動轉義(除非已經轉義過)。用下面的命令搜尋 HTTPie logo
可以在 google 圖片上結果:
http www.google.com search==`HTTPie logo` tbm==isch
GET /?search=HTTPie+logo&tbm=isch HTTP/1.1
localhost 的 URL 縮寫
另外,類似 curl
的 localhost 縮寫也是支援的。這表示你可以使用 :3000
來代替http://localhost:3000
, 如果不傳入埠號,80
將會預設被使用
http :/foo
GET /foo HTTP/1.1
Host: localhost
http :3000/bar
GET /bar HTTP/1.1
Host: localhost:3000
http :
GET / HTTP/1.1
Host: localhost
自定義預設的方案
你可以使用 --default-scheme <URL_SCHEME>
引數來指定非 HTTP 的其它協義
alias https=`http --default-scheme=https`
請求項
不同的請求項型別提供一種便捷的方法來指定 HTTP 頭、簡單的 JSON
、表單資料、檔案、URL 引數
URL 引數後面緊隨的是 鍵/值
對引數都會被拼裝成請求傳送。不同型別的 鍵/值
對分割符號分別是::
, =
, :=
, @
, =@
, :=@
。用 @
分割的參數列示檔案路徑
項型別(item type) | 描述(Description) |
---|---|
HTTP 頭引數<br/> Name:Value
|
任意的 HTTP 頭,比如:X-API-Token:123
|
URL 引數<br/> name==value
|
通過分割符 == 表示一個查詢字串的 鍵/值 對 |
資料域<br/> field=value ,<br/> field=@file.txt
|
請求一個預設會被序列化成 JSON 的資料域,或者表單型別 form-encoded(--form, -f)
|
純 JSON 域<br/> field:=json ,<br/> field:=@file.json
|
當需要指定一個或者多數域引數型別 boolean , number .. 時非常有用, 比如:meals:=`[“ham”,”spam”]` or pies:=[1,2,3] (注意引號). |
Form 表單檔案域 | 僅當傳入引數 --form, -f 時有效,比如 screenshot@~/Pictures/img.png 檔案內容將會被序列化成 multipart/form-data 傳送 |
資料域不是唯一的指定請求資料的方式,重定向輸入也可以
字元轉義規則
可以使用 來轉義不應該被用於分割符的情況。比如
foo==bar
會被轉義成一個資料鍵值對(foo= 和 bar)而不是 URL 引數
通常情況需要使用引號包圍值,比如 foo=`bar baz`
如果有一個域的名字或者 header 以減號開頭,你需要把這些引數放在一個特殊符號 --
後面
,這樣做是為了和 --arguments
區分開
http httpbin.org/post -- -name-starting-with-dash=foo -Unusual-Header:bar
POST /post HTTP/1.1
-Unusual-Header: bar
Content-Type: application/json
{
"-name-starting-with-dash": "value"
}
JSON
JSON 是現代 web services 通用規範,HTTPie 也預設遵循了它的 不嚴格的資料型別
http PUT example.org name=John email=john@example.org
PUT / HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Content-Type: application/json
Host: example.org
{
"name": "John",
"email": "john@example.org"
}
預設行為
如果你的命令包含了一些請求項資料,它們將預設被序列化成 JSON 物件。HTTPie
會預設自動新增下面兩個 header 頭,當然這兩個頭也可以重新傳入
Content-Type | application/json |
---|---|
Accept | application/json, */* |
明確的 JSON
你可以使用命令列引數 --json, -j
明確地設定 Accept
為 application/json
而無需在意傳送的資料是什麼(這是個快捷方式,也可以使用普通的 header 註解:`http
url Accept:`application/json, /“),另外,HTTPie 會試著檢測 JSON 響應,即使Content-Type
是不正常的 text/plain
或者未知型別
非字串的 JSON 域
非字串型別的 JSON 域使用 :=
分割,這可以允許你嵌入原生純 JSON
到結果物件,文字和原生的純 JSNO 檔案也可以使用 =@
和 :=G
嵌入
http PUT api.example.com/person/1
name=John
age:=29 married:=false hobbies:=`["http", "pies"]` # Raw JSON
description=@about-john.txt # Embed text file
bookmarks:=@bookmarks.json # Embed JSON file
PUT /person/1 HTTP/1.1
Accept: application/json, */*
Content-Type: application/json
Host: api.example.com
{
"age": 29,
"hobbies": [
"http",
"pies"
],
"description": "John is a nice guy who likes pies.",
"married": false,
"name": "John",
"bookmarks": {
"HTTPie": "http://httpie.org",
}
}
不過請注意,當傳送複雜資料的時候,這個例子使用的語法會顯得很笨重。在這種情況下 重定向輸入 將會更合適:
http POST api.example.com/person/1 < person.json
表單
提交表單和傳送 JSON 請求很相似,通常情況下唯一的不同是新增額外的 --form, -f
引數,這將確保資料域和 Content-Type
被設定成 application/x-www-form-urlencoded; charset=utf-8
普通的表單
http --form POST api.example.org/person/1 name=`John Smith`
POST /person/1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=utf-8
name=John+Smith
檔案上傳表單
如果有一個檔案域,序列化方式和 content type 會是 multipart/form-data
:
http -f POST example.com/jobs name=`John Smith` cv@~/Documents/cv.pdf
上面的請求和下面的 HTML 表單傳送請求是一樣的:
<form enctype="multipart/form-data" method="post" action="http://example.com/jobs">
<input type="text" name="name" />
<input type="file" name="cv" />
</form>
注意 @
用來模擬檔案上傳域,而 =@
是把檔案內容以文字的方式嵌入到資料域的值裡面
HTTP 頭
可以使用 Header:Value
註解的形式來新增自定義頭資訊
http example.org User-Agent:Bacon/1.0 `Cookie:valued-visitor=yes;foo=bar`
X-Foo:Bar Referer:http://httpie.org/
GET / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Cookie: valued-visitor=yes;foo=bar
Host: example.org
Referer: http://httpie.org/
User-Agent: Bacon/1.0
X-Foo: Bar
預設的請求頭
有幾個預設的請求頭是 HTTPie 設定的
GET / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: HTTPie/<version>
Host: <taken-from-URL>
空頭和重新設定預設頭
可以使用 Header:
來取消上面的幾個預設頭資訊
http httpbin.org/headers Accept: User-Agent:
請求中的 Accept
和 User-Agent
頭都會被移除
使用 Header;
表示新增一個為空的頭資訊,注意須使用引號
http -v httpbin.org/headers `Host;`
GET /headers HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host:
User-Agent: HTTPie/0.9.9
...
授權驗證
目前支援的驗證方案有基礎和摘要兩種(檢視更多 授權外掛),有兩種標識來控制驗證:
引數 | 說明 |
---|---|
--auth, -a |
把 使用者名稱:密碼 做為鍵值對引數傳入,如果只指定使用者名稱可以使用 -a 使用者名稱 ,密碼在接下來的提示符中輸入,空密碼使用 username: ,username:password@hostname 格式的 URL 語法也是支援的,證照通過 -a 引數傳入且具有更高的優先順序 |
--auth-type, -A |
指定指定身份驗證機制。basic (預設) 和 digest 兩種 |
Basic 授權
http -a username:password example.org
Digest 授權
http -A digest -a username:password example.org
密碼提示
http -a username example.org<Paste>
.netrc
從你的 ~/.netrc
檔案授權也可以
cat ~/.netrc
machine httpbin.org
login httpie
password test
http httpbin.org/basic-auth/httpie/test
HTTP/1.1 200 OK
[...]
授權外掛
授權機制可以使用安裝外掛的方式來實現,可以在 Python Package 上面找到更多相關外掛
- httpie-api-auth: ApiAuth
- httpie-aws-auth: AWS / Amazon S3
- httpie-edgegrid: EdgeGrid
- httpie-hmac-auth: HMAC
- httpie-jwt-auth: JWTAuth (JSON Web Tokens)
- httpie-negotiate: SPNEGO (GSS Negotiate)
- httpie-ntlm: NTLM (NT LAN Manager)
- httpie-oauth: OAuth
- requests-hawk: Hawk
HTTP 重定向
HTTP 重定向預設不會自動跳轉,請求發出後命令列只會顯示 第一次 收到的響應
http httpbin.org/redirect/3
按 header 頭中的 location 欄位值跳轉
指定 --follow, -F
引數讓 HTTPie 自動跟隨 30x
響應頭中的 location
欄位值進行跳轉,並且顯示最終的響應內容
http --follow httpbin.org/redirect/3
顯示中間的跳轉響應
如果你也想看到更多的跳轉資訊,可以指定 --all
引數
http --follow --all httpbin.org/redirect/3
限制重定向最大次數
改變預設最大 30
次重定向值可以使用 --max-redirects=<limit>
引數
http --follow --all --max-redirects=5 httpbin.org/redirect/3
代理
你可以通過新增引數 --proxy
來指定各自協義(為了防止跨協義的重定向,協義被包含在了引數值中)的代理伺服器
http --proxy=http:http://10.10.1.10:3128 --proxy=https:https://10.10.1.10:1080 example.org
新增 basic 授權
http --proxy=http:http://user:pass@10.10.1.10:3128 example.org
環境變數
也可以通過設定 HTTP_PROXY
和 HTTPS_PROXY
環境變數來配置代理,底層的 request
庫也將使用這些代理配置,如果你想指定某些 host 不使用代理,可以通過新增 NO_PROXY
引數來實現
在你的 ~/.bash_profile
檔案中(zsh 則在 ~/.zshrc
中)
export HTTP_PROXY=http://10.10.1.10:3128
export HTTPS_PROXY=https://10.10.1.10:1080
export NO_PROXY=localhost,example.com
Socks
要啟用 socks 代理支援請使用 pip 安裝 requests[socks]
庫
pip install -U requests[socks]
用法與其它型別的代理相同:
http --proxy=http:socks5://user:pass@host:port --proxy=https:socks5://user:pass@host:port example.org
HTTPS
伺服器 SSL 證照驗證
使用引數 --verify=no
可以跳過主機 SSL 驗證(預設:yes
)
http --verify=no https://example.org
自定義 CA 包
使用 --verify=<CA_BUNDLE_PATH>
指定 CA 認證包路徑
http --cert=client.pem https://example.org
客戶端 SSL 證照
使用客戶端 SSL 證照進行 SSL 通訊,可以用 --cert
引數指定證照檔案路徑
http --cert=client.pem https://example.org
如果證照中不包含私鑰,可以通過 --cert-key
引數指定金鑰檔案路徑
http --cert=client.crt --cert-key=client.key https://example.org
SSL 版本
引數 --ssl=<PROTOCOL>
用來指定你想使用的 SSL 協義版本,預設是 `SSL
v2.3`。這將會協商服務端和你安裝的 OpenSSL 支援的最高 SSL
協議版本。可用的版本有: ssl2.3
, ssl3
, tls1
, tls1.1
, tls1.2
(實際上可用的協義可能有很多種,這由你安裝的 OpenSSL 決定)
# 指定容易受到攻擊的 SSL v3 協義與老伺服器進行通訊
http --ssl=ssl3 https://vulnerable.example.org
伺服器名稱指示 SNI(Server Name Indication)
如果你的 HTTPie 版本(可以使用 http --debug
檢視版本)小於 2.7.9,又需要使用
SNI 與伺服器會話。那麼你需要安裝額外的依賴
pip install --upgrade requests[security]
使用下面的命令測試 SNI 支援
http https://sni.velox.ch
輸出引數
HTTPie 預設只輸出最終響應資訊並且列印(header,
body同樣),你可以通過下面一些引數控制列印內容:
命令列引數 | 描述 |
---|---|
–headers, -h | 僅列印響應頭 |
–body, -b | 僅列印響應體 |
–verbose, -v | 列印所有的 HTTP 請求來回內容,這將預設開啟 --all 引數 |
使用 --verbose
引數來除錯請求或生成文件時是非常有用的
http --verbose PUT httpbin.org/put hello=world
PUT /put HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Content-Type: application/json
Host: httpbin.org
User-Agent: HTTPie/0.2.7dev
{
"hello": "world"
}
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 477
Content-Type: application/json
Date: Sun, 05 Aug 2012 00:25:23 GMT
Server: gunicorn/0.13.4
{
[…]
}
哪部分的 HTTP 請求內容應該列印出來
所有的 HTTP 輸出選項都屬於更強大的 --print, -p
引數的快捷方式。--print, -p
接受一個字串,字串的每個字母都表示下面的 HTTP 某一部分
字元 | 代表 |
---|---|
H |
請求頭 |
B |
請求體 |
h |
響應頭 |
b |
響應體 |
列印請求頭和響應頭:
http --print=Hh PUT httpbin.org/put hello=world
檢視中間的請求/響應
使用 --all
引數可以檢視 HTTP 通訊中的所有資訊,中間的 HTTP
通訊包括跟隨重定向(使用引數--follow
)和使用 HTTP
摘要授權時第一次未授權的請求(使用引數 --auth=diggest
)
# 包括最終響應之前的所有響應資訊
http --all --follow httpbin.org/redirect/3
中間請求/響應預設會使用 --print, -p
引數指定的值格式化,可以使用 --history-print, -P
指定,
引數和 --print, -p
是一樣的。但是這隻實用於 中間請求
# 中間請求/響應資訊使用 H 格式化,最終請求/響應資訊使用 Hh 格式化:
http -A digest -a foo:bar --all -p Hh -P H httpbin.org/digest-auth/auth/foo/bar
條件化的 body 內容下載
做為一個優化項,響應體在僅作為輸出一部分時才會被下載,這和 HEAD
型別的請求類似(除了 HEAD 可以使用在任何 HTTP 請求中)
比如有一個 API 更新後會返回整個資源,但是你只對更新後響應頭中的狀態碼感興趣:
http --headers PATCH example.org/Really-Huge-Resource name=`New Name`
由於我們在上面設定了只列印頭資訊,當響應頭接收完成的時候伺服器連線就會被關閉,
頻寬和時間不會浪費在下載響應體,你可以不必在意。響應頭總是會被下載的無論它是不是輸出部分
重定向輸入
直接從 stdin
(標準輸入)管道傳入請求資料是大部分人認為比較好的方法。
這些資料被緩衝而且不需要更多的操作就可以做為請求體被使用,使用管道有下面幾個好用的方法:
從一個檔案重新定向
http PUT example.com/person/1 X-API-Token:123 < person.json
或者從其它程式的輸出
grep `401 Unauthorized` /var/log/httpd/error_log | http POST example.org/intruders
當然也可以使用 echo
命令來傳簡單資料
echo `{"name": "John"}` | http PATCH example.com/person/1 X-API-Token:123
甚至可以使用 web services
http GET https://api.github.com/repos/jkbrzt/httpie | http POST httpbin.org/post
也可以使用 cat
命令來輸入多行文字
cat | http POST example.com
<paste>
^D
cat | http POST example.com/todos Content-Type:text/plain
- buy milk
- call parents
^D
在 macOS 中可以使用 pbpaste
命令把剪貼簿中的內容做為資料傳送
pbpaste | http PUT example.com
通過 stdin
傳遞資料的方式 不能 和指定資料域的方式混合使用
echo `data` | http POST example.org more=data # 不可以
從一個檔案中取請求資料
指定檔案路徑(@/path/to/file
)方式可以替代上面使用 stdin
的方式
這個方法有個優點,Content-Type
可以根據提供的副檔名自動設定成對應的。比如下面的請求會被設定頭 Content-Type: application/xml
http PUT httpbin.org/put @/data/file.xml
命令列輸出
HTTPie 預設會做一些事情,目的是為了讓命令列輸出內容有更高的可讀性
顏色和格式化
語法高亮會應用在 HTTP 請求的 headers 和 body 裡面。如果你不喜歡預設的配色方案,可以使用--style
引數自定義(使用http --help
命令檢視更多選項)
還有下面幾個格式化規則會被使用:
- HTTP 頭會按名稱排序
- JSON 資料會有縮排,並且按 key 名排序,unicode 序列會被轉換成實際字元
下面這些引數可以用在處理輸出結果中:
命令列引數 | 描述 |
---|---|
–pretty=all | 應用顏色和格式化,預設 |
–pretty=colors | 僅應用顏色 |
–pretty=format | 僅應用格式化 |
–pretty=none | 不使用顏色和格式化,重定向時預設使用 |
二進位制資料
二進位制資料在命令列中會被禁止,這會使處理響應返回的二進位制資料變得更安全,重定向時也禁止二進位制資料,但是會被裝飾輸出。一旦當我們知道響應體是二進位制資料時,連線會關閉
http example.org/Movie.mov
你幾乎可以立即看見下面的提示:
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Encoding: gzip
Content-Type: video/quicktime
Transfer-Encoding: chunked
+-----------------------------------------+
| NOTE: binary data not shown in terminal |
+-----------------------------------------+
重定向輸出
與命令列輸出相比,重定向輸出使用了不同的預設值,不同之處在於:
- 格式化和種顏色預設不會使用(除非
--pretty
被指定) - 只輸出響應體(除非指定了輸出引數)
- 二進位制結果不會被禁止
原因是為了把 HTTPie 的結果直接 piping
到其它程式,並且使下載檔案不需要額外的引數標識。多數情況下輸出重定向時只有響應體有意義
下載一個檔案:
http example.org/Movie.mov > Movie.mov
下載 Octocat 圖片,使用 ImageMagick 修改大小,上傳到其它地方:
http octodex.github.com/images/original.jpg | convert - -resize 25% - | http example.org/Octocats
強制使用格式化與顏色,在 less
的分頁中顯示請求和響應
http --pretty=all --verbose example.org | less -R
-R
標識告訴 less
命令解析 HTTPie 輸出中的顏色序列
你可以使用下面的 bash 函式程式碼建立一個呼叫 HTTPie
分頁格式化且高亮輸出的快捷方式:
function httpless {
# `httpless example.org`
http --pretty=all --print=hb "$@" | less -R;
}
下載模式
HTTPie 具有下載模式,這和 wget
命令類似
使用 --download, -d
標識啟用,響應頭會列印到命令列,下載響應體的進度條也會顯示
http --download https://github.com/jkbrzt/httpie/archive/master.tar.gz
HTTP/1.1 200 OK
Content-Disposition: attachment; filename=httpie-master.tar.gz
Content-Length: 257336
Content-Type: application/x-gzip
Downloading 251.30 kB to "httpie-master.tar.gz"
Done. 251.30 kB in 2.73862s (91.76 kB/s)
下載檔案的檔名
如果沒有指定引數 --output, -o
,檔名將由 Content-Disposition
決定,或者通過
URL 及其 Content-Type
,如果名字已佔用,HTTPie 會新增唯一字尾
下載的同時 piping
即使響應頭和進度狀態顯示在命令列中,你仍然可以將響應重定向到其它的程式
http -d https://github.com/jkbrzt/httpie/archive/master.tar.gz | tar zxf -
恢復下載
如果指定 --output, -o
,你可以 --continue, -c
恢復部分下載。不過僅當伺服器支援 Range
請求而且響應返回 206 Partial Content
才可以,如果伺服器不支援這個功能,那就只會下載整個檔案
http -dco file.zip example.org/file
其它注意事項
-
--download
僅更改響應正文的處理方式 - 仍然可以使用自定義 header 頭、使用 session 會話,
--verbose, -v
等 -
--download
意味著啟用--follow
- 如果檔案沒有被完全下載完,HTTPie 將會返回錯誤狀態碼
1
並退出 -
Accept-Encoding
不能和--download
一起使用
流式響應
響應體會被以塊的形式下載和列印,這使程式在不使用大量記憶體情況下進行流式傳輸和下載,然而如果使用顏色和格式化引數,整個 響應體會被緩衝,然後立即處理
禁用緩衝
可以使用 --stream, -S
進行下面的操作:
- 輸出內容以更小的塊更新,不需要任何緩衝,這使得 HTTPie 表現的像
tail -f
命令一樣 - 即使輸出被美化,流也會啟用:它將應用於響應的每一行並立即更新。這樣就可以為持續時間長的請求提供一個漂亮的輸出,例如一個 Twitter 的流 API
示例
修飾過的流響應
http --stream -f -a YOUR-TWITTER-NAME https://stream.twitter.com/1/statuses/filter.json track=`Justin Bieber`
像 tail -f
一樣小塊的流輸出
http --stream -f -a YOUR-TWITTER-NAME https://stream.twitter.com/1/statuses/filter.json track=Apple
| while read tweet; do echo "$tweet" | http POST example.org/tweets ; done
會話
預設情況下,同一個 host 每個 HTTPie 發出的請求完全獨立
然而,HTTPie 支援使用 --session=SESSION_NAME_OR_PATH
引數進行持久會話。在同一個 host 的會話中,自定義 header(除了以Content-
和 If-
開頭)、authorization、cookies(手動指定或者伺服器傳送) 會持續儲存
# 建立一個新會話
http --session=/tmp/session.json example.org API-Token:123
# 複製用已存在的會話 API-Token 會自動設定
http --session=/tmp/session.json example.org
所有的會話資料都會被儲存成純文字,這表示會話檔案可以使用編輯器手動新增或者修改——其實就是 JSON 資料
具名會話
每個 host 都可以建一個或者多個會話,比如:下面的命令將為 host 是 example.org
的請求建一個名為 name1
的會話:
http --session=user1 -a user1:password example.org X-Foo:Bar
從現在起,你就通過名字來選擇會話,當你選擇使用一個會話時,之前用過的授權、HTTP
頭都會被自動新增:
http --session=user1 example.org
建立或者重用不同的會話,只需要指定不同的名字即可:
http --session=user2 -a user2:password example.org X-Bar:Foo
具名會話將被以 JSON 的資料格式儲存在 ~/.httpie/sessions/<host>/<name>.json
下面(windows下則是 %APPDATA%httpiesessions<host><name>.json
)
匿名會話
不同與具名會話,你也可以直接使用一個檔案路徑來指定會話檔案的儲存地址,這也可以在不同的 host 間複用會話:
http --session=/tmp/session.json example.org
http --session=/tmp/session.json admin.example.org
http --session=~/.httpie/sessions/another.example.org/test.json example.org
http --session-read-only=/tmp/session.json example.org
只讀會話
如果複用一個會話又不想更新會話資訊,可以通過指定 --session-read-only=SESSION_NAME_OR_PATH
來實現
配置
HTTPie 使用了一個簡單的 JSON 配置檔案
配置檔案路徑
預設的配置檔案路徑在 ~/.httpie/config.json
(window 在 %APPDATA%httpieconfig.json
),配置檔案的路徑也可以通過修改環境變數 HTTPIE_CONFIG_DIR
來更改,可以使用 http --debug
命令檢視當前配置檔案路徑
可配置的引數
JSON 配置檔案包含以下的鍵:
default_options
引數預設值陣列(預設為空),陣列裡面的引數會被應用於每次 HTTPie 的呼叫
比如說,你可以使用這個選項改變預設的樣式和輸出引數:"default_options": ["--style=fruity", "--body"]
,另外一個常用的預設引數是 "--session=default"
,這會讓 HTTPie 總是使用會話(名稱為default)。也可以使用 --form
改變預設 不嚴格的 JSON 型別為 form 型別
__meta__
HTTPie 自動儲存了一些它自己的後設資料,不要動它
取消之前指定的引數
配置檔案中的引數和其它任何指定引數的方法,都可以使用 --no-OPTION
引數來取消,比如:--no-style
或者 --no-session
指令碼
當你在 shell 指令碼中使用 HTTPie 的時候,--check-status
標識會比較好用。這個標識將告知 HTTPie 如果響應狀態碼是 3xx
, 4xx
, 5xx
時程式將退出並顯示對應的錯誤碼 3
(除非 --follow
引數被指定), 4
, 5
#!/bin/bash
if http --check-status --ignore-stdin --timeout=2.5 HEAD example.org/health &> /dev/null; then
echo `OK!`
else
case $? in
2) echo `Request timed out!` ;;
3) echo `Unexpected HTTP 3xx Redirection!` ;;
4) echo `HTTP 4xx Client Error!` ;;
5) echo `HTTP 5xx Server Error!` ;;
6) echo `Exceeded --max-redirects=<n> redirects!` ;;
*) echo `Other Error!` ;;
esac
fi
最佳實踐
在非互動式呼叫的情況下通常不希望使用 stdin
的預設行為,可以使用 --ignore-stdin
引數來禁止它
如果沒有這個選項,HTTPie 可能會掛起,這是一個常見的問題。發生的場景可能是——例如從定時任務中呼叫HTTPie時,stdin
未連線到終端。因此,重定向輸入的規則適用,即 HTTPie 開始讀取它,希望請求體將被傳遞。由於沒有資料也沒有 EOF,它會被卡住。因此,除非你將一些資料傳遞給 HTTPie,否則應在指令碼中使用此標誌
當然使用 --timeout
引數手動設定(預設 30 秒)延遲時間是個比較好的做法
元資訊
介面設計
命令列引數的設計與通過網路傳送 HTTP 請求的過程密切相關。這使得 HTTPie
的命令更容易記憶和閱讀。有時你甚至可以把原生的 HTTP
請求串連到一行就很自然的形成了 HTTPie 的命令列引數。例如 對比下面這個原生 HTTP
請求:
POST /collection HTTP/1.1
X-API-Key: 123
User-Agent: Bacon/1.0
Content-Type: application/x-www-form-urlencoded
name=value&name2=value2
和使用 HTTPie 命令傳送同樣的引數:
http -f POST example.org/collection
X-API-Key:123
User-Agent:Bacon/1.0
name=value
name2=value2
注意他們兩者的順序和引數都非常相似,並且只有一小部分命令用於控制 HTTPie(-f
表示讓 HTTPie 傳送一個 from 請求),並且不直接對應於請求的任何部分
兩種模式:--pretty=all
(命令列中預設)、--pretty=none
(重定向輸出時預設),對互動式使用和指令碼呼叫都比較友好,HTTPie 在這過程中作為通用的 HTTP 客戶端
由於 HTTPie 還在頻繁的開發中,現有的一些命令列引數在最終版 1.0
釋出之前可能會有一些微小的調整。這些調整都會在變更日誌 裡面記錄
使用者支援
你可以通過下面的一些途徑找到幫助支援
- GitHub issues
- Our Gitter chat room
- StackOverflow
- Twitter @clihttp,也可以直接 @jkbrzt
相關專案
依賴
HTTPie 底層使用了兩個特別棒的庫:
Requests — Python HTTP 庫
Pygments — Python 程式碼高亮
HTTPie 的朋友
HTTPie 可以和下面兩個好友愉快地玩耍:
貢獻
變更日誌
插圖
許可證
BSD-3-Clause: LICENSE
作者
Jakub Roztocil (@jkbrzt)
創造了 HTTPie,還有一些 優秀的人 也貢獻力量