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