摘要:目標是讓與的交互盡可能的更友好。在版本以上已經(jīng)成為了默認的版本。不同類型的鍵值對分割符號分別是。這將會協(xié)商服務端和你安裝的支持的最高協(xié)議版本。
博客原文?
HTTPie 是一個命令行 HTTP 客戶端。目標是讓 CLI 與 Web services 的交互盡可能的更友好。它提供了一個簡單的 http 命令,可以讓我們用簡單自然的表述發(fā)送任意 HTTP 請求,并且可以輸出帶代碼高亮的結(jié)果。HTTPie 可以使用在測試、調(diào)試以及通用的與 HTTP 交互場景
主要功能特性自然而且簡單的命令語句
格式化且高亮顯示輸出內(nèi)容
內(nèi)置 JSON 支持
表單和文件上傳
支持 HTTPS, 代理和授權(quán)驗證
支持多樣化的請求數(shù)據(jù)格式
自定義 headers 頭
持久 sessions 存儲
類似 wget 的下載模式
兼容 Python 2.6, 2.7 以及 3.x
支持 Linux, macOS 和 Windows 操作系統(tǒng)
插件支持
詳細的文檔說明
完善的測試用例覆蓋
安裝 macOS在 macOS 系統(tǒng)中推薦使用 Homebrew 來安裝:
brew install httpie
當然 MacPorts 也是可以的:
port install httpieLinux
大多數(shù)的 Linux 構(gòu)建版都提供了包管理組件,可以使用他們來安裝:
# 基于 Debian Linux 的構(gòu)建版,比如 Ubuntu apt-get install httpie # 基于 RPM Linux 的構(gòu)建版 yum install httpie # Arch Linux 系統(tǒng) pacman -S httpieWindows 及其它
使用 pip 是一種通用的(可以使用在 Windows, MacOS, Linux ...)并且提供最新版本安裝包的安裝方法
# 確保使用了最新版本的 pip 和 setuptools: pip install --upgrade pip setuptools pip install --upgrade httpie開發(fā)版
最新的開發(fā)版本可以直接通過 github 安裝
# Homebrew brew install httpie --HEAD # pip pip install --upgrade https://github.com/jkbrzt/httpie/archive/master.tar.gzPython 版本
雖然兼容 Python 2.6, 2.7 版本的,但是如果可以的話還是建議使用最新版的 Python 3.x 來安裝 HTTPie。這將保證一些比較新的功能(比如:SNI )可以開箱即用。Python 3 在 Homebrew 0.9.4 版本以上已經(jīng)成為了默認的 Python 版本??梢允褂?http --debug 來查看 HTTPie 使用的 python 版本
使用最簡單的使用:
http httpie.org
使用語法:
http [flags] [METHOD] URL [ITEM [ITEM]]
也可以使用 http --help 來查看更多使用方法:
例子自定義 HTTP 方法,HTTP 頭和 JSON 數(shù)據(jù):
http PUT example.org X-API-Token:123 name=John
表單提交:
http -f POST example.org hello=World
使用一個輸出參數(shù) -v 來查看請求信息(默認不顯示請求信息):
http -v example.org
使用 Github API 向 issue 發(fā)送一條評論(需要授權(quán)驗證參數(shù)):
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.comHTTP 方法
HTTP 方法的名稱在 URL 參數(shù)之前:
http DELETE example.org/todos/7
這看起來就像是原生的 HTTP 請求發(fā)送的文本一樣:
DELETE /todos/7 HTTP/1.1請求 URL
HTTPie 唯一必傳的一個參數(shù)是請求 URL,默認的方案不出意料的是
http://,可以在請求的時候缺省 - http example.org 是沒問題的
如果需要在命令行手動構(gòu)建 URLs,你可能會覺得使用 param==value 添加參數(shù)的方式是比較方便的,這樣你就不需要擔心命令行中轉(zhuǎn)義鏈接字符串 & 的問題,當然參數(shù)中的特殊字符也將被自動轉(zhuǎn)義(除非已經(jīng)轉(zhuǎn)義過)。用下面的命令搜索 HTTPie logo 可以在 google 圖片上結(jié)果:
http www.google.com search=="HTTPie logo" tbm==isch GET /?search=HTTPie+logo&tbm=isch HTTP/1.1localhost 的 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
alias https="http --default-scheme=https"請求項
不同的請求項類型提供一種便捷的方法來指定 HTTP 頭、簡單的 JSON
、表單數(shù)據(jù)、文件、URL 參數(shù)
URL 參數(shù)后面緊隨的是 鍵/值 對參數(shù)都會被拼裝成請求發(fā)送。不同類型的 鍵/值
對分割符號分別是::, =, :=, @, =@, :=@。用 @
分割的參數(shù)表示文件路徑
項類型(item type) | 描述(Description) |
---|---|
HTTP 頭參數(shù) Name:Value |
任意的 HTTP 頭,比如:X-API-Token:123 |
URL 參數(shù) name==value |
通過分割符 == 表示一個查詢字符串的 鍵/值 對 |
數(shù)據(jù)域 field=value, [email protected] |
請求一個默認會被序列化成 JSON 的數(shù)據(jù)域,或者表單類型 form-encoded(--form, -f) |
純 JSON 域 field:=json, field:[email protected] |
當需要指定一個或者多數(shù)域參數(shù)類型 boolean, number .. 時非常有用, 比如:meals:="["ham","spam"]" or pies:=[1,2,3] (注意引號). |
Form 表單文件域 | 僅當傳入?yún)?shù) --form, -f 時有效,比如 screenshot@~/Pictures/img.png 文件內(nèi)容將會被序列化成 multipart/form-data 發(fā)送 |
數(shù)據(jù)域不是唯一的指定請求數(shù)據(jù)的方式,重定向輸入也可以
字符轉(zhuǎn)義規(guī)則可以使用 來轉(zhuǎn)義不應該被用于分割符的情況。比如 foo==bar
會被轉(zhuǎn)義成一個數(shù)據(jù)鍵值對(foo= 和 bar)而不是 URL 參數(shù)
通常情況需要使用引號包圍值,比如 foo="bar baz"
如果有一個域的名字或者 header 以減號開頭,你需要把這些參數(shù)放在一個特殊符號 -- 后面
,這樣做是為了和 --arguments 區(qū)分開
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 是現(xiàn)代 web services 通用規(guī)范,HTTPie 也默認遵循了它的 不嚴格的數(shù)據(jù)類型
http PUT example.org name=John [email protected] PUT / HTTP/1.1 Accept: application/json, */* Accept-Encoding: gzip, deflate Content-Type: application/json Host: example.org { "name": "John", "email": "[email protected]" }默認行為
如果你的命令包含了一些請求項數(shù)據(jù),它們將默認被序列化成 JSON 對象。HTTPie
會默認自動添加下面兩個 header 頭,當然這兩個頭也可以重新傳入
Content-Type | application/json |
---|---|
Accept | application/json, */* |
你可以使用命令行參數(shù) --json, -j 明確地設置 Accept 為 application/json
而無需在意發(fā)送的數(shù)據(jù)是什么(這是個快捷方式,也可以使用普通的 header 注解:`http
url Accept:"application/json, /"`),另外,HTTPie 會試著檢測 JSON 響應,即使
Content-Type 是不正常的 text/plain 或者未知類型
非字符串類型的 JSON 域使用 := 分割,這可以允許你嵌入原生純 JSON
到結(jié)果對象,文本和原生的純 JSNO 文件也可以使用 =@ 和 :=G 嵌入
http PUT api.example.com/person/1 name=John age:=29 married:=false hobbies:="["http", "pies"]" # Raw JSON [email protected] # Embed text file bookmarks:[email protected] # 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", } }
不過請注意,當發(fā)送復雜數(shù)據(jù)的時候,這個例子使用的語法會顯得很笨重。在這種情況下 重定向輸入 將會更合適:
http POST api.example.com/person/1 < person.json表單
提交表單和發(fā)送 JSON 請求很相似,通常情況下唯一的不同是添加額外的 --form, -f
參數(shù),這將確保數(shù)據(jù)域和 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 表單發(fā)送請求是一樣的:
注意 @ 用來模擬文件上傳域,而 =@
是把文件內(nèi)容以文本的方式嵌入到數(shù)據(jù)域的值里面
可以使用 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/空頭和重新設置默認頭Host:
可以使用 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 ...授權(quán)驗證
目前支持的驗證方案有基礎和摘要兩種(查看更多 授權(quán)插件),有兩種標識來控制驗證:
參數(shù) | 說明 |
---|---|
--auth, -a | 把 用戶名:密碼 做為鍵值對參數(shù)傳入,如果只指定用戶名可以使用 -a 用戶名,密碼在接下來的提示符中輸入,空密碼使用 username:,username:password@hostname 格式的 URL 語法也是支持的,證書通過 -a 參數(shù)傳入且具有更高的優(yōu)先級 |
--auth-type, -A | 指定指定身份驗證機制。basic(默認) 和 digest 兩種 |
http -a username:password example.orgDigest 授權(quán)
http -A digest -a username:password example.org密碼提示
http -a username example.org.netrc
從你的 ~/.netrc 文件授權(quán)也可以
cat ~/.netrc machine httpbin.org login httpie password test http httpbin.org/basic-auth/httpie/test HTTP/1.1 200 OK [...]授權(quán)插件
授權(quán)機制可以使用安裝插件的方式來實現(xiàn),可以在 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 重定向默認不會自動跳轉(zhuǎn),請求發(fā)出后命令行只會顯示 第一次 收到的響應
http httpbin.org/redirect/3按 header 頭中的 location 字段值跳轉(zhuǎn)
指定 --follow, -F 參數(shù)讓 HTTPie 自動跟隨 30x 響應頭中的 location
字段值進行跳轉(zhuǎn),并且顯示最終的響應內(nèi)容
http --follow httpbin.org/redirect/3顯示中間的跳轉(zhuǎn)響應
如果你也想看到更多的跳轉(zhuǎn)信息,可以指定 --all 參數(shù)
http --follow --all httpbin.org/redirect/3限制重定向最大次數(shù)
改變默認最大 30 次重定向值可以使用 --max-redirects=
http --follow --all --max-redirects=5 httpbin.org/redirect/3代理
你可以通過添加參數(shù) --proxy 來指定各自協(xié)義(為了防止跨協(xié)義的重定向,協(xié)義被包含在了參數(shù)值中)的代理服務器
http --proxy=http:http://10.10.1.10:3128 --proxy=https:https://10.10.1.10:1080 example.org
添加 basic 授權(quán)
http --proxy=http:http://user:[email protected]:3128 example.org環(huán)境變量
也可以通過設置 HTTP_PROXY 和 HTTPS_PROXY 環(huán)境變量來配置代理,底層的 request
庫也將使用這些代理配置,如果你想指定某些 host 不使用代理,可以通過添加 NO_PROXY 參數(shù)來實現(xiàn)
在你的 ~/.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.comSocks
要啟用 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.orgHTTPS 服務器 SSL 證書驗證
使用參數(shù) --verify=no 可以跳過主機 SSL 驗證(默認:yes)
http --verify=no https://example.org自定義 CA 包
使用 --verify=
http --cert=client.pem https://example.org客戶端 SSL 證書
使用客戶端 SSL 證書進行 SSL 通信,可以用 --cert 參數(shù)指定證書文件路徑
http --cert=client.pem https://example.org
如果證書中不包含私鑰,可以通過 --cert-key 參數(shù)指定密鑰文件路徑
http --cert=client.crt --cert-key=client.key https://example.orgSSL 版本
參數(shù) --ssl=
v2.3`。這將會協(xié)商服務端和你安裝的 OpenSSL 支持的最高 SSL
協(xié)議版本??捎玫陌姹居校?ssl2.3, ssl3 , tls1 , tls1.1 , tls1.2
(實際上可用的協(xié)義可能有很多種,這由你安裝的 OpenSSL 決定)
# 指定容易受到攻擊的 SSL v3 協(xié)義與老服務器進行通信 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輸出參數(shù)
HTTPie 默認只輸出最終響應信息并且打印(header,
body同樣),你可以通過下面一些參數(shù)控制打印內(nèi)容:
命令行參數(shù) | 描述 |
---|---|
--headers, -h | 僅打印響應頭 |
--body, -b | 僅打印響應體 |
--verbose, -v | 打印所有的 HTTP 請求來回內(nèi)容,這將默認開啟 --all 參數(shù) |
使用 --verbose 參數(shù)來調(diào)試請求或生成文檔時是非常有用的
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 請求內(nèi)容應該打印出來
所有的 HTTP 輸出選項都屬于更強大的 --print, -p 參數(shù)的快捷方式。--print, -p
接受一個字符串,字符串的每個字母都表示下面的 HTTP 某一部分
字符 | 代表 |
---|---|
H | 請求頭 |
B | 請求體 |
h | 響應頭 |
b | 響應體 |
打印請求頭和響應頭:
http --print=Hh PUT httpbin.org/put hello=world查看中間的請求/響應
使用 --all 參數(shù)可以查看 HTTP 通信中的所有信息,中間的 HTTP
通信包括跟隨重定向(使用參數(shù)--follow)和使用 HTTP
摘要授權(quán)時第一次未授權(quán)的請求(使用參數(shù) --auth=diggest)
# 包括最終響應之前的所有響應信息 http --all --follow httpbin.org/redirect/3
中間請求/響應默認會使用 --print, -p 參數(shù)指定的值格式化,可以使用 --history-print, -P 指定,
參數(shù)和 --print, -p 是一樣的。但是這只實用于 中間請求
# 中間請求/響應信息使用 H 格式化,最終請求/響應信息使用 Hh 格式化: http -A digest -a foo:bar --all -p Hh -P H httpbin.org/digest-auth/auth/foo/bar條件化的 body 內(nèi)容下載
做為一個優(yōu)化項,響應體在僅作為輸出一部分時才會被下載,這和 HEAD
類型的請求類似(除了 HEAD 可以使用在任何 HTTP 請求中)
比如有一個 API 更新后會返回整個資源,但是你只對更新后響應頭中的狀態(tài)碼感興趣:
http --headers PATCH example.org/Really-Huge-Resource name="New Name"
由于我們在上面設置了只打印頭信息,當響應頭接收完成的時候服務器連接就會被關閉,
帶寬和時間不會浪費在下載響應體,你可以不必在意。響應頭總是會被下載的無論它是不是輸出部分
直接從 stdin (標準輸入)管道傳入請求數(shù)據(jù)是大部分人認為比較好的方法。
這些數(shù)據(jù)被緩沖而且不需要更多的操作就可以做為請求體被使用,使用管道有下面幾個好用的方法:
從一個文件重新定向
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 命令來傳簡單數(shù)據(jù)
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^D
cat | http POST example.com/todos Content-Type:text/plain - buy milk - call parents ^D
在 macOS 中可以使用 pbpaste 命令把剪貼板中的內(nèi)容做為數(shù)據(jù)發(fā)送
pbpaste | http PUT example.com
通過 stdin 傳遞數(shù)據(jù)的方式 不能 和指定數(shù)據(jù)域的方式混合使用
echo "data" | http POST example.org more=data # 不可以從一個文件中取請求數(shù)據(jù)
指定文件路徑(@/path/to/file)方式可以替代上面使用 stdin 的方式
這個方法有個優(yōu)點,Content-Type
可以根據(jù)提供的文件擴展名自動設置成對應的。比如下面的請求會被設置頭 Content-Type: application/xml
http PUT httpbin.org/put @/data/file.xml命令行輸出
HTTPie 默認會做一些事情,目的是為了讓命令行輸出內(nèi)容有更高的可讀性
顏色和格式化語法高亮會應用在 HTTP 請求的 headers 和 body 里面。如果你不喜歡默認的配色方案,可以使用
--style 參數(shù)自定義(使用http --help命令查看更多選項)
還有下面幾個格式化規(guī)則會被使用:
HTTP 頭會按名稱排序
JSON 數(shù)據(jù)會有縮進,并且按 key 名排序,unicode 序列會被轉(zhuǎn)換成實際字符
下面這些參數(shù)可以用在處理輸出結(jié)果中:
命令行參數(shù) | 描述 |
---|---|
--pretty=all | 應用顏色和格式化,默認 |
--pretty=colors | 僅應用顏色 |
--pretty=format | 僅應用格式化 |
--pretty=none | 不使用顏色和格式化,重定向時默認使用 |
二進制數(shù)據(jù)在命令行中會被禁止,這會使處理響應返回的二進制數(shù)據(jù)變得更安全,重定向時也禁止二進制數(shù)據(jù),但是會被裝飾輸出。一旦當我們知道響應體是二進制數(shù)據(jù)時,連接會關閉
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被指定)
只輸出響應體(除非指定了輸出參數(shù))
二進制結(jié)果不會被禁止
原因是為了把 HTTPie 的結(jié)果直接 piping
到其它程序,并且使下載文件不需要額外的參數(shù)標識。多數(shù)情況下輸出重定向時只有響應體有意義
下載一個文件:
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 函數(shù)代碼建立一個調(diào)用 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)下載文件的文件名
如果沒有指定參數(shù) --output, -o,文件名將由 Content-Disposition 決定,或者通過
URL 及其 Content-Type,如果名字已占用,HTTPie 會添加唯一后綴
即使響應頭和進度狀態(tài)顯示在命令行中,你仍然可以將響應重定向到其它的程序
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 將會返回錯誤狀態(tài)碼 1 并退出
Accept-Encoding 不能和 --download 一起使用
流式響應響應體會被以塊的形式下載和打印,這使程序在不使用大量內(nèi)存情況下進行流式傳輸和下載,然而如果使用顏色和格式化參數(shù),整個 響應體會被緩沖,然后立即處理
禁用緩沖可以使用 --stream, -S 進行下面的操作:
輸出內(nèi)容以更小的塊更新,不需要任何緩沖,這使得 HTTPie 表現(xiàn)的像 tail -f 命令一樣
即使輸出被美化,流也會啟用:它將應用于響應的每一行并立即更新。這樣就可以為持續(xù)時間長的請求提供一個漂亮的輸出,例如一個 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 發(fā)出的請求完全獨立
然而,HTTPie 支持使用 --session=SESSION_NAME_OR_PATH
參數(shù)進行持久會話。在同一個 host 的會話中,自定義 header(除了以Content- 和 If- 開頭)、authorization、cookies(手動指定或者服務器發(fā)送) 會持續(xù)保存
# 創(chuàng)建一個新會話 http --session=/tmp/session.json example.org API-Token:123 # 復制用已存在的會話 API-Token 會自動設置 http --session=/tmp/session.json example.org
所有的會話數(shù)據(jù)都會被存儲成純文本,這表示會話文件可以使用編輯器手動添加或者修改——其實就是 JSON 數(shù)據(jù)
具名會話每個 host 都可以建一個或者多個會話,比如:下面的命令將為 host 是 example.org 的請求建一個名為 name1 的會話:
http --session=user1 -a user1:password example.org X-Foo:Bar
從現(xiàn)在起,你就通過名字來選擇會話,當你選擇使用一個會話時,之前用過的授權(quán)、HTTP
頭都會被自動添加:
http --session=user1 example.org
創(chuàng)建或者重用不同的會話,只需要指定不同的名字即可:
http --session=user2 -a user2:password example.org X-Bar:Foo
具名會話將被以 JSON 的數(shù)據(jù)格式存儲在 ~/.httpie/sessions/
下面(windows下則是 %APPDATA%httpiesessions
不同與具名會話,你也可以直接使用一個文件路徑來指定會話文件的存儲地址,這也可以在不同的 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 來實現(xiàn)
配置HTTPie 使用了一個簡單的 JSON 配置文件
配置文件路徑默認的配置文件路徑在 ~/.httpie/config.json (window 在 %APPDATA%httpieconfig.json),配置文件的路徑也可以通過修改環(huán)境變量 HTTPIE_CONFIG_DIR 來更改,可以使用 http --debug 命令查看當前配置文件路徑
可配置的參數(shù)JSON 配置文件包含以下的鍵:
default_options
參數(shù)默認值數(shù)組(默認為空),數(shù)組里面的參數(shù)會被應用于每次 HTTPie 的調(diào)用
比如說,你可以使用這個選項改變默認的樣式和輸出參數(shù):"default_options": ["--style=fruity", "--body"] ,另外一個常用的默認參數(shù)是 "--session=default",這會讓 HTTPie 總是使用會話(名稱為default)。也可以使用 --form 改變默認 不嚴格的 JSON 類型為 form 類型
__meta__
HTTPie 自動存儲了一些它自己的元數(shù)據(jù),不要動它
取消之前指定的參數(shù)配置文件中的參數(shù)和其它任何指定參數(shù)的方法,都可以使用 --no-OPTION
參數(shù)來取消,比如:--no-style 或者 --no-session
當你在 shell 腳本中使用 HTTPie 的時候,--check-status
標識會比較好用。這個標識將告知 HTTPie 如果響應狀態(tài)碼是 3xx, 4xx, 5xx
時程序?qū)⑼顺霾@示對應的錯誤碼 3(除非 --follow 參數(shù)被指定), 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=最佳實踐redirects!" ;; *) echo "Other Error!" ;; esac fi
在非交互式調(diào)用的情況下通常不希望使用 stdin 的默認行為,可以使用 --ignore-stdin 參數(shù)來禁止它
如果沒有這個選項,HTTPie 可能會掛起,這是一個常見的問題。發(fā)生的場景可能是——例如從定時任務中調(diào)用HTTPie時,stdin 未連接到終端。因此,重定向輸入的規(guī)則適用,即 HTTPie 開始讀取它,希望請求體將被傳遞。由于沒有數(shù)據(jù)也沒有 EOF,它會被卡住。因此,除非你將一些數(shù)據(jù)傳遞給 HTTPie,否則應在腳本中使用此標志
當然使用 --timeout 參數(shù)手動設置(默認 30 秒)延遲時間是個比較好的做法
元信息 接口設計命令行參數(shù)的設計與通過網(wǎng)絡發(fā)送 HTTP 請求的過程密切相關。這使得 HTTPie
的命令更容易記憶和閱讀。有時你甚至可以把原生的 HTTP
請求串連到一行就很自然的形成了 HTTPie 的命令行參數(shù)。例如 對比下面這個原生 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 命令發(fā)送同樣的參數(shù):
http -f POST example.org/collection X-API-Key:123 User-Agent:Bacon/1.0 name=value name2=value2
注意他們兩者的順序和參數(shù)都非常相似,并且只有一小部分命令用于控制 HTTPie(-f 表示讓 HTTPie 發(fā)送一個 from 請求),并且不直接對應于請求的任何部分
兩種模式:--pretty=all(命令行中默認)、--pretty=none(重定向輸出時默認),對交互式使用和腳本調(diào)用都比較友好,HTTPie 在這過程中作為通用的 HTTP 客戶端
由于 HTTPie 還在頻繁的開發(fā)中,現(xiàn)有的一些命令行參數(shù)在最終版 1.0
發(fā)布之前可能會有一些微小的調(diào)整。這些調(diào)整都會在變更日志 里面記錄
你可以通過下面的一些途徑找到幫助支持
GitHub issues
Our Gitter chat room
StackOverflow
Twitter @clihttp,也可以直接 @jkbrzt
相關項目 依賴HTTPie 底層使用了兩個特別棒的庫:
Requests — Python HTTP 庫
Pygments — Python 代碼高亮
HTTPie 可以和下面兩個好友愉快地玩耍:
jq
http-prompt
CONTRIBUTING.rst
變更日志CHANGELOG
插圖claudiatd/httpie-artwork
許可證BSD-3-Clause: LICENSE
作者Jakub Roztocil (@jkbrzt)
創(chuàng)造了 HTTPie,還有一些 優(yōu)秀的人 也貢獻力量
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42367.html
摘要:請回復這個帖子并注明組織個人信息來申請加入。版筆記等到中文字幕翻譯完畢后再整理。數(shù)量超過個,在所有組織中排名前。網(wǎng)站日超過,排名的峰值為。主頁歸檔社區(qū)自媒體平臺微博知乎專欄公眾號博客園簡書合作侵權(quán),請聯(lián)系請抄送一份到贊助我們 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1...
摘要:請回復這個帖子并注明組織個人信息來申請加入。權(quán)限分配靈活,能者居之。數(shù)量超過個,在所有組織中排名前。網(wǎng)站日超過,排名的峰值為。導航歸檔社區(qū)自媒體平臺微博知乎專欄公眾號博客園簡書合作侵權(quán),請聯(lián)系請抄送一份到贊助我們 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=...
摘要:誠然,宣稱官方中文文檔,確實不妥,這只是個人社區(qū)的行為,改正就好了至于合入官方的途徑,只需有翻譯成果,也不難做到最后,一個站點接些貼片廣告,哪有什么不妥我所了解到的社區(qū)翻譯情況,大致如上。 近幾天,很多公眾號發(fā)布了 Python 官方文檔的消息。然而,一個特別奇怪的現(xiàn)象就發(fā)生了,讓人啼笑皆非。 Python 文檔的中文翻譯工作一直是默默無聞,幾個月前,我還吐槽過這件事《再聊聊Pytho...
摘要:版微信第三方登陸包括微信微博等等,查看支持列表擴展好用的圖片處理,也方便使用百度版百度版支付集合,包含支付寶等支付寶在的封裝各國語言包,包含簡體中文生成二維碼工具,親測好用未完大家可以向我推薦,直接在本文下留言即可。 Laravel不權(quán)威導航 Hi 這里是Roy整理的Laravel相關索引,希望能幫到大家showImg(http://static.segmentfault.com/bu...
閱讀 682·2021-11-25 09:43
閱讀 1688·2021-11-18 10:02
閱讀 1067·2021-10-15 09:39
閱讀 1918·2021-10-12 10:18
閱讀 2151·2021-09-22 15:43
閱讀 795·2021-09-22 15:10
閱讀 2110·2019-08-30 15:53
閱讀 1011·2019-08-30 13:00