HTTPie 官方文件中文翻譯版

keelii發表於2019-02-16

部落格原文»

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 明確地設定 Acceptapplication/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:

請求中的 AcceptUser-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 上面找到更多相關外掛

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_PROXYHTTPS_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
釋出之前可能會有一些微小的調整。這些調整都會在變更日誌 裡面記錄

使用者支援

你可以通過下面的一些途徑找到幫助支援

相關專案

依賴

HTTPie 底層使用了兩個特別棒的庫:

Requests — Python HTTP 庫
Pygments — Python 程式碼高亮

HTTPie 的朋友

HTTPie 可以和下面兩個好友愉快地玩耍:

jq
http-prompt

貢獻

CONTRIBUTING.rst

變更日誌

CHANGELOG

插圖

claudiatd/httpie-artwork

許可證

BSD-3-Clause: LICENSE

作者

Jakub Roztocil (@jkbrzt)
創造了 HTTPie,還有一些 優秀的人 也貢獻力量

相關文章