GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

jakubroztocil

httpie – 最新のコマンドラインHTTPクライアント – 直感的なUI、JSONサポート、構文のハイライト、wgetのようなダウンロード、拡張機能など、ユ..

投稿日:

最新のコマンドラインHTTPクライアント – 直感的なUI、JSONサポート、構文のハイライト、wgetのようなダウンロード、拡張機能など、ユーザーフレンドリーなカールの代替手段。https : //httpie.org https://twitter.com/clihttp

HTTPie:人間のためのCLI、cURLのようなツール

HTTPie( aitch-tee-tee-pieと発音)は、コマンドラインHTTPクライアントです。 その目的は、WebサービスとのCLIインタラクションを人的にやりがいのあるものにすることです。 これは単純で自然な構文を使用して任意のHTTP要求を送信できる単純なhttpコマンドを提供し、カラー出力を表示します。 HTTPieは、HTTPサーバーのテスト、デバッグ、および一般的な対話に使用できます。

内容

1主な特徴

  • 表現的で直感的な構文
  • フォーマット済みおよびカラー化された端末出力
  • 組み込みのJSONサポート
  • フォームとファイルのアップロード
  • HTTPS、プロキシ、および認証
  • 任意のリクエストデータ
  • カスタムヘッダー
  • 永続セッション
  • Wgetのようなダウンロード
  • Python 2.7および3.xのサポート
  • Linux、macOS、Windowsのサポート
  • プラグイン
  • ドキュメンテーション
  • テストカバレッジ

2インストール

2.1 macOS

macOSでは、 Homebrew経由でHTTPieをインストールできます(推奨)。

$ brew install httpie

MacPorts ポートも利用できます:

$ port install httpie

2.2 Linux

ほとんどのLinuxディストリビューションでは、システムパッケージマネージャを使用してインストールできるパッケージが提供されています。

# Debian, Ubuntu, etc.
$ apt-get install httpie
# Fedora
$ dnf install httpie
# CentOS, RHEL, ...
$ yum install httpie
# Arch Linux
$ pacman -S httpie

2.3 Windowsなど

普遍的なインストール方法(Windows、Mac OS X、Linux、…で動作し、常に最新バージョンを提供します)はpipを使用することです:

# Make sure we have an up-to-date version of pip and setuptools:
$ pip install --upgrade pip setuptools

$ pip install --upgrade httpie

pipインストールが何らかの理由で失敗した場合、fallbackとしてeasy_install httpieを試すことができます)。

2.4 Pythonバージョン

Python 2.7もサポートされていますが、できるだけ最新のPython 3.xに対してHTTPieをインストールすることを強く推奨します。 これにより、 SNI(Server Name Indication)などの新しいHTTP機能の一部が確実に機能します。 Python 3は、バージョン0.9.4から始まるHomebrewインストールのデフォルトです。 HTTPieが使用するバージョンを確認するには、 http --debug実行しhttp --debug

2.5不安定版

GitHubのmasterブランチから最新の未リリースの最新開発版を直接入手することもできます。 将来の安定したリリースの進行中の作業であり、その経験はそれほど滑らかではないかもしれません。

MacOSでは、Homebrewでインストールすることができます:

$ brew install httpie --HEAD

そうでなければpip

$ pip install --upgrade https://github.com/jakubroztocil/httpie/archive/master.tar.gz

-dev接尾辞付きの現在の開発バージョン識別子があることを確認します。たとえば、次のようになります。

$ http --version
1.0.0-dev

3使用法

こんにちは世界:

$ http httpie.org

シノプシス:

$ http [flags] [METHOD] URL [ITEM [ITEM]]

http --helpも参照してください。

3.1例

カスタムHTTPメソッドHTTPヘッダーJSONデータ:

$ http PUT example.org X-API-Token:123 name=John

フォームの送信:

$ http -f POST example.org hello=World

次のいずれかの出力オプションを使用して、送信されている要求を確認します

$ http -v example.org

Github APIを使用して、 認証の 問題に関するコメントを投稿します

$ http -a USERNAME POST https://api.github.com/repos/jakubroztocil/httpie/issues/83/comments body='HTTPie is awesome! :heart:'

リダイレクトされた入力を使用してファイルをアップロードする:

$ http example.org < file.json

ファイルをダウンロードし、 リダイレクトされた出力を介して保存します

$ http example.org/file > file

ファイルwgetスタイルをダウンロードする:

$ http --download example.org/file

指定されたセッションを使用して、同じホストへの要求間で一定の側面または通信を永続させます。

$ http --session=logged-in -a username:password httpbin.org/get API-Key:123

$ http --session=logged-in httpbin.org/headers

不足しているDNSレコードを回避するカスタムHostヘッダーを設定する:

$ http localhost:8000 Host:example.com

4 HTTPメソッド

HTTPメソッドの名前は、URL引数の直前にあります。

$ http DELETE example.org/todos/7

送信される実際のRequest-Line似ています:

DELETE /todos/7 HTTP/1.1

コマンドからMETHOD引数を省略すると、HTTPieはデフォルトでGET (要求データなし)またはPOST (要求データ付き)のいずれかになります。

5リクエストURL

HTTPieが要求を実行するために必要とする唯一の情報はURLです。 デフォルトのスキームは、やや驚くことではないが、 http://であり、引数から省略することができます – http example.orgうまく動作します。

5.1クエリー・ストリングのパラメータ

ターミナルでクエリ文字列パラメータを使用して手動でURLを作成する場合は、URLパラメータを追加するためのparam==value構文を理解してください。 これでシェルの&区切り記号をエスケープする心配はありません。 また、パラメータ値の特殊文字も自動的にエスケープされます(そうでない場合は、URLはすでにエスケープされています)。 GoogleイメージでHTTPie logoを検索するには、次のコマンドを使用します。

$ http www.google.com search=='HTTPie logo' tbm==isch
GET /?search=HTTPie+logo&tbm=isch HTTP/1.1

5.2 localhost URLショートカット

さらに、localhostのカールのような省略形もサポートされています。 つまり、 :3000http://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

5.3カスタムデフォルトスキーム

--default-scheme <URL_SCHEME>オプションを使用すると、HTTP以外のプロトコル用のショートカットを作成できます。

$ alias https='http --default-scheme=https'

6アイテムをリクエストする

HTTPヘッダー、単純なJSON、フォームデータ、ファイル、およびURLパラメーターを指定するための便利なメカニズムを提供するいくつかの異なる要求アイテムタイプがあります。

URLの後に指定されたキーと値のペアです。 すべてが共通しているのは、送信される実際のリクエストの一部となり、そのタイプは、使用されるセパレータ:=:===@=@ 、および=@によってのみ区別されるということです。 @がついているファイルパスは、値としてファイルパスが必要です。

アイテムタイプ 説明
HTTPヘッダーName:Value 任意のHTTPヘッダー、たとえばX-API-Token:123
URLパラメータname==value 指定された名前/値のペアをクエリ文字列パラメータとしてURLに追加します。 ==セパレータが使用されます。
データフィールドfield=valuefield=value field=@file.txt データフィールドをJSONオブジェクトとしてシリアル化する(デフォルト)か、フォームエンコードする( --form, -f )かをリクエストします。
未処理のJSONフィールドのfield:=jsonfield:=@file.json JSONを送信するときに便利です。たとえば、 meals:='["ham","spam"]'またはpies:=[1,2,3] meals:='["ham","spam"]'など、 BooleanNumber 、入れ子Objectpies:=[1,2,3] (引用符に注意してください)。
フォームファイルのフィールドfield@/dir/file --form, -fのみ利用可能です。 たとえば、 screenshot@~/Pictures/img.png ファイルフィールドが存在すると、 multipart/form-data要求が発生します。

データフィールドは要求データを指定する唯一の方法ではないことに注意してください。 リダイレクトされた入力は、任意の要求データを渡すためのメカニズムです。

6.1ルールのエスケープ

セパレータ(またはその一部)として使用すべきでない文字をエスケープするには\を使用できます。 たとえば、 foo\==barは、URLパラメータではなく、データのキーと値のペア( foo=bar )になります。

多くの場合、 foo='bar baz'ように値を引用する必要があります。

フィールド名またはヘッダーのいずれかがマイナス(たとえば、 -fieldname )で始まっている場合は、特別なトークンの後にそのようなアイテムをすべて配置して、 --arguments混同を--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"
}

7 JSON

JSONは現代のWebサービスの共通言語であり、デフォルトで使用される暗黙のコンテンツタイプ 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"
}

7.1デフォルト動作

コマンドにいくつかのデータ要求項目が含まれている場合、それらはデフォルトでJSONオブジェクトとしてシリアル化されます。 HTTPieは自動的に次のヘッダーも設定します。どちらも上書きできます。

Content-Type application/json
Accept application/json, */*

7.2明示的なJSON

データを送信するかどうかに関わらず、 application/json --json, -jを明示的にapplication/json設定することができます(通常のヘッダ表記でヘッダを設定するためのショートカットです: http url Accept:'application/json, */*' )。 さらに、HTTPieは、 Content-Typetext/plainまたはunknownで間違っていても、JSON応答を検出しようとします。

7.3非文字列のJSONフィールド

非文字列フィールドは、 :=区切り文字を使用して、生のJSONを結果のオブジェクトに埋め込むことができます。 テキストと未加工のJSONファイルは、 =@:=@ :を使用してフィールドに埋め込むこともできます。

$ 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

8つのフォーム

フォームの送信は、 JSONリクエストの送信と非常によく似ています。 唯一の違いは、– --form, -fオプションを追加することです。このオプションは、データフィールドが次のようにシリアライズされ、 Content-Typeapplication/x-www-form-urlencoded; charset=utf-8設定されることを保証しますapplication/x-www-form-urlencoded; charset=utf-8 application/x-www-form-urlencoded; charset=utf-8 設定ファイルを介してJSONではなくフォームデータを暗黙のコンテンツタイプにすることは可能です。

8.1通常の書式

$ 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

8.2ファイルアップロードフォーム

1つまたは複数のファイルフィールドが存在する場合、シリアライズとコンテンツタイプは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>

@はファイルアップロードフォームフィールドをシミュレートするために使用され、一方、 =@はファイルコンテンツを通常のテキストフィールド値として埋め込むことに注意してください。

9つの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

9.1デフォルトのリクエストヘッダ

HTTPieが設定するいくつかのデフォルトヘッダーがあります:

GET / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: HTTPie/<version>
Host: <taken-from-URL>

Hostを除くすべてのものは上書きすることができ、そのうちいくつかは設定解除されます。

9.2空のヘッダーとヘッダーの設定を解除する

以前に指定したヘッダ(デフォルトのヘッダの1つなど)を解除するには、 Header:使用しHeader:

$ http httpbin.org/headers Accept: User-Agent:

空の値を持つヘッダーを送信するには、ヘッダーを使用しHeader;

$ http httpbin.org/headers 'Header;'

10認証

現在サポートされている認証方式は、BasicとDigestです(詳細はauthプラグインを参照してください)。 認証を制御する2つのフラグがあります。

--auth, -a 引数としてusername:password組を渡します。 または、ユーザー名( -a username )のみを指定すると、要求が送信される前にパスワードの入力を求められます。 空のパスワードを送信するには、 username:渡しusername: username:password@hostname URL構文もサポートされていますが、 -a渡された資格情報の方が優先されます。
--auth-type, -A 認証メカニズムを指定します。 可能な値はbasicdigestです。 デフォルト値はbasicなので省略することができます。

10.1基本認証

$ http -a username:password example.org

10.2ダイジェスト認証

$ http -A digest -a username:password example.org

10.3パスワードプロンプト

$ http -a username example.org

10.4 .netrc

あなたの~/.netrcファイルからの認証情報も尊重されます:

$ cat ~/.netrc
machine httpbin.org
login httpie
password test

$ http httpbin.org/basic-auth/httpie/test
HTTP/1.1 200 OK
[...]

10.5認証プラグイン

追加の認証メカニズムをプラグインとしてインストールできます。 それらはPython Package Indexにあります。 いくつかの選択肢があります:

11 HTTPリダイレクト

デフォルトでは、HTTPリダイレクトは追跡されず、最初の応答のみが表示されます。

$ http httpbin.org/redirect/3

11.1フォローのLocation

HTTPieに30xレスポンスのLocationヘッダに従って代わりに最終応答を表示するように指示するには、– --follow, -Fオプションを使用します。

$ http --follow httpbin.org/redirect/3

11.2中間リダイレクト応答の表示

さらに仲介リクエスト/応答を表示したい場合は、– --allオプションも使用してください:

$ http --follow --all httpbin.org/redirect/3

11.3最大リダイレクトを制限する

最大30リダイレクトのデフォルト制限を変更するには、– --max-redirects=<limit>オプションを使用します。

$ http --follow --all --max-redirects=5 httpbin.org/redirect/3

12のプロキシ

各プロトコル(プロトコル間のリダイレクトの場合の値に含まれます)に--proxy引数を使用して、使用するプロキシを指定できます。

$ http --proxy=http:http://10.10.1.10:3128 --proxy=https:https://10.10.1.10:1080 example.org

基本認証の場合:

$ http --proxy=http:http://user:pass@10.10.1.10:3128 example.org

12.1環境変数

環境変数HTTP_PROXYHTTPS_PROXYでプロキシを構成することもできます。また、基礎となるRequestsライブラリもそれらを選択します。 特定のホストの環境変数で設定されたプロキシを無効にする場合は、 NO_PROXY指定できます。

あなたの~/.bash_profile

export HTTP_PROXY=http://10.10.1.10:3128
export HTTPS_PROXY=https://10.10.1.10:1080
export NO_PROXY=localhost,example.com

12.2 SOCKS

自家製のHTTPieには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

13 HTTPS

13.1サーバーSSL証明書の確認

ホストのSSL証明書検証をスキップするには、– --verify=no渡します(デフォルトはyes )。

$ http --verify=no https://example.org

13.2カスタムCAバンドル

--verify=<CA_BUNDLE_PATH>を使用して、カスタムCAバンドルパスを設定することもできます。

$ http --verify=/ssl/custom_ca_bundle https://example.org

13.3クライアント側のSSL証明書

SSL通信にクライアント側の証明書を使用するには、certファイルのパスを--certで渡すことができます。

$ http --cert=client.pem https://example.org

秘密鍵がcertファイルに含まれていない場合は、–cert --cert-key使用して鍵ファイルのパスを渡すことができ--cert-key

$ http --cert=client.crt --cert-key=client.key https://example.org

13.4 SSLバージョン

--ssl=<PROTOCOL>を使用して、使用するプロトコルのバージョンを指定します。 これはデフォルトでSSL v2.3になり、サーバーとOpenSSLのインストールの両方がサポートする最高のプロトコルをネゴシエートします。 使用可能なプロトコルは、 ssl2.3ssl3tls1tls1.1tls1.2です。 (実際に使用できるプロトコルのセットは、OpenSSLのインストールによって異なる場合があります)。

# Specify the vulnerable SSL v3 protocol to talk to an outdated server:
$ http --ssl=ssl3 https://vulnerable.example.org

13.5 SNI(サーバ名表示)

もしHTTPieをPythonのバージョンが2.7.9より低く( http --debugで確認できる)、SNI(Server Name Indication)を使用するサーバと対話する必要がある場合、いくつかの依存関係を追加する必要があります:

$ pip install --upgrade requests[security]

SNIサポートをテストするには、次のコマンドを使用できます。

$ http https://sni.velox.ch

14の出力オプション

デフォルトでは、HTTPieは最終応答のみを出力し、応答メッセージ全体が出力されます(ヘッダーと本文の両方)。 いくつかのオプションを使って何を印刷するかを制御することができます:

--headers, -h 応答ヘッダーのみが印刷されます。
--body, -b レスポンス本文のみが出力されます。
--verbose, -v HTTP交換全体(要求と応答)を出力します。 このオプションは--allも有効にします(下記参照)。
--print, -p HTTP交換の一部を選択します。

--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

{
    […]
}

14.1 HTTP交換のどの部分を印刷するべきか

他のすべての出力オプションは、より強力な--print, -pためのショートカットです。 HTTP交換の特定の部分を表す文字列を受け取ります。

キャラクター を意味する
H 要求ヘッダー
B 要求団体
h 応答ヘッダー
b レスポンスボディ

リクエストヘッダとレスポンスヘッダを出力する:

$ http --print=Hh PUT httpbin.org/put hello=world

14.2中間リクエスト/応答の表示

すべてのHTTP通信、つまり最終要求/応答、および可能な中間要求/応答を表示するには、– --allオプションを使用します。 中間HTTP通信には、フォローリダイレクト( – --follow )、HTTPダイジェスト認証が使用されたときの最初の不正リクエスト( --auth=digest )などが含まれます。

# Include all responses that lead to the final one:
$ http --all --follow httpbin.org/redirect/3

仲介リクエスト/応答は、デフォルトで--print, -p (および上記のショートカット)に従ってフォーマットされています。 これを変更したい場合は、– --history-print, -Pオプションを使用して--history-print, -P --print, -pと同じ引数を--print, -pますが、仲介要求にのみ適用されます。

# Print the intermediary requests/responses differently than the final one:
$ http -A digest -a foo:bar --all -p Hh -P H httpbin.org/digest-auth/auth/foo/bar

14.3条件付きボディのダウンロード

最適化として、応答本体は、出力の一部である場合にのみサーバーからダウンロードされます。 これはHEADリクエストの実行と同様ですが、使用するHTTPメソッドに適用される点が異なります。

リソースが更新されたときにリソース全体を返すAPIがあるとしますが、更新後にステータスコードを確認するための応答ヘッダーのみに興味があるとします。

$ http --headers PATCH example.org/Really-Huge-Resource name='New Name'

ここではHTTPヘッダーのみを出力しているので、すべての応答ヘッダーが受信されるとすぐにサーバーへの接続が閉じられます。 したがって、気にしない身体をダウンロードしても、帯域幅と時間は無駄になりません。 レスポンスヘッダーは出力の一部ではなくても常にダウンロードされます

15リダイレクト入力

要求データを渡す普遍的な方法は、リダイレクトされた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

HTTPieを使用してWebサービスを一緒にパイプすることもできます:

$ http GET https://api.github.com/repos/jakubroztocil/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

OS Xでは、 pbpasteを使用してクリップボードの内容を送信できます。

$ pbpaste | http PUT example.com

stdinを介してデータを渡すことは、コマンドラインで指定されたデータフィールドと組み合わせることはできません:

$ echo 'data' | http POST example.org more=data   # This is invalid

HTTPieがstdinデータを読み込まないようにするには、– --ignore-stdinオプションを使用します。

15.1ファイル名からデータを要求する

リダイレクトされたstdinの代わりに、 stdinようにコンテンツが使用されるファイル名( @/path/to/file )を指定する方法があります。

Content-Typeヘッダーは、ファイル名拡張子に基づいて適切な値に自動的に設定されるという利点があります。 たとえば、次の要求はXMLファイルの逐語コンテンツをContent-Type: application/xmlで送信します。application Content-Type: application/xml

$ http PUT httpbin.org/put @/data/file.xml

16ターミナル出力

HTTPieは、端末出力を読みやすくするために、いくつかのことをデフォルトで行います。

16.1色と書式設定

構文の強調表示はHTTPヘッダーと本文に適用されます(意味があります)。 デフォルトの--styleが気に入らない場合は、– --styleオプションを使用して--style配色を選択できます(可能な値については$ http --helpを参照)。

また、次の書式設定が適用されます。

  • HTTPヘッダーは名前でソートされます。
  • JSONデータはインデントされ、キーでソートされ、ユニコードエスケープはそれらが表す文字に変換されます。

これらのオプションの1つを使用して、出力処理を制御できます。

--pretty=all 色と書式の両方を適用します。 端末出力のデフォルト。
--pretty=colors 色を適用します。
--pretty=format 書式を適用します。
--pretty=none 出力処理を無効にします。 リダイレクトされた出力のデフォルト。

16.2バイナリデータ

ターミナル出力のためにバイナリデータが抑制されるため、バイナリデータを返すURLへのリクエストを安全に実行できます。 バイナリデータは、リダイレクトされたがプレタイジングされた出力でも抑制されます。 レスポンスボディがバイナリであることがわかったらすぐに接続が閉じられます。

$ 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 |
+-----------------------------------------+

17リダイレクト出力

HTTPieは、リダイレクトされた出力に対して、 端末出力とは異なるデフォルトのセットを使用します 違いは:

  • 書式設定と色は適用されません( --prettyが指定されていない限り)。
  • レスポンス本文のみが出力されます出力オプションのいずれかが設定されていない場合)。
  • また、バイナリデータは抑制されません。

その理由は、HTTPieの出力を別のプログラムに配管し、ファイルをダウンロードする際に余分なフラグを設定しないようにするためです。 ほとんどの場合、出力がリダイレクトされたときに生のレスポンスボディのみが対象となります。

ファイルをダウンロードする:

$ 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フラグは、HTTPieの出力に含まれるカラーエスケープシーケンスを解釈するためにlessを指示します。

~/.bash_profile次のものを追加することで、カラー化された出力とページングされた出力を持つHTTPieを呼び出すためのショートカットを作成できます:

function httpless {
    # `httpless example.org'
    http --pretty=all --print=hb "$@" | less -R;
}

18ダウンロードモード

HTTPieには、 wgetと同様に動作するダウンロードモードがあります。

--download, -dフラグを使用して有効にすると、応答ヘッダーが端末( stderr )にstderrされ、応答本体がファイルに保存されている間に進行状況バーが表示されます。

$ http --download https://github.com/jakubroztocil/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)

18.1ダウンロードしたファイル名

--output, -oで提供されない場合、出力ファイル名はContent-Disposition (利用可能な場合)、またはURLとContent-Typeから決定されます。 推測されたファイル名がすでに存在する場合、HTTPieはそれに固有の接尾辞を追加します。

18.2ダウンロード中の配管

応答ヘッダーと進行状況が端末に表示されている間に、応答本体を別のプログラムにリダイレクトすることもできます。

$ http -d https://github.com/jakubroztocil/httpie/archive/master.tar.gz |  tar zxf -

18.3ダウンロードの再開

--output, -oを指定した場合、– --continue, -cオプションを使用して部分ダウンロードを再開できます。 これは、 Range要求と206 Partial Content応答をサポートするサーバーでのみ機能します。 サーバーがそれをサポートしていない場合、ファイル全体がダウンロードされます。

$ http -dco file.zip example.org/file

18.4その他の注意事項

  • --downloadオプションは、応答本体の処理方法のみを変更します。
  • カスタムヘッダーを設定したり、セッション、– --verbose, -vなどを使用することもできます。
  • --download常に--downloadを意味し--follow (リダイレクトに従います)。
  • 本文が完全にダウンロードされていない場合、HTTPieは状態コード1 (エラー)で終了します。
  • Accept-Encoding--downloadで設定できません。

19ストリーミングされたレスポンス

レスポンスはチャンクにダウンロードされ、出力されます。チャンクでは、あまりメモリを使用せずにストリーミングや大きなファイルのダウンロードが可能です。 ただし、 色と書式が適用されると、応答全体がバッファされ、一度に処理されます。

19.1バッファリングの無効化

--stream, -Sフラグを使用すると、 --stream, -S 2つのことが起こります。

  1. 出力は、バッファリングなしではるかに小さなチャンクでフラッシュされるため、HTTPieはURLのtail -fのような振る舞いをします。
  2. ストリーミングは、出力が事前確認されている場合でも有効になります。応答の各行に適用され、すぐにフラッシュされます。 This makes it possible to have a nice output for long-lived requests, such as one to the Twitter streaming API.

19.2 Examples use cases

Prettified streamed response:

$ http --stream -f -a YOUR-TWITTER-NAME https://stream.twitter.com/1/statuses/filter.json track='Justin Bieber'

Streamed output by small chunks alá tail -f :

# Send each new tweet (JSON object) mentioning "Apple" to another
# server as soon as it arrives from the Twitter streaming API:
$ 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

20 Sessions

By default, every request HTTPie makes is completely independent of any previous ones to the same host.

However, HTTPie also supports persistent sessions via the --session=SESSION_NAME_OR_PATH option. In a session, custom headers (except for the ones starting with Content- or If- ), authorization, and cookies (manually specified or sent by the server) persist between requests to the same host.

# Create a new session
$ http --session=/tmp/session.json example.org API-Token:123

# Re-use an existing session — API-Token will be set:
$ http --session=/tmp/session.json example.org

All session data, including credentials, cookie data, and custom headers are stored in plain text. That means session files can also be created and edited manually in a text editor—they are regular JSON.

20.1 Named sessions

You can create one or more named session per host. For example, this is how you can create a new session named user1 for example.org :

$ http --session=user1 -a user1:password example.org X-Foo:Bar

From now on, you can refer to the session by its name. When you choose to use the session again, any the previously used authorization and HTTP headers will automatically be set:

$ http --session=user1 example.org

To create or reuse a different session, simple specify a different name:

$ http --session=user2 -a user2:password example.org X-Bar:Foo

Named sessions’ data is stored in JSON files in the directory ~/.httpie/sessions/<host>/<name>.json ( %APPDATA%\httpie\sessions\<host>\<name>.json on Windows).

20.2 Anonymous sessions

Instead of a name, you can also directly specify a path to a session file. This allows for sessions to be re-used across multiple hosts:

$ 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

20.3 Readonly session

To use an existing session file without updating it from the request/response exchange once it is created, specify the session name via --session-read-only=SESSION_NAME_OR_PATH instead.

21 Config

HTTPie uses a simple JSON config file.

21.1 Config file location

The default location of the configuration file is ~/.httpie/config.json (or %APPDATA%\httpie\config.json on Windows). The config directory location can be changed by setting the HTTPIE_CONFIG_DIR environment variable. To view the exact location run http --debug .

21.2 Configurable options

The JSON file contains an object with the following keys:

21.2.1 default_options

An Array (by default empty) of default options that should be applied to every invocation of HTTPie.

For instance, you can use this option to change the default style and output options: "default_options": ["--style=fruity", "--body"] Another useful default option could be "--session=default" to make HTTPie always use sessions (one named default will automatically be used). Or you could change the implicit request content type from JSON to form by adding --form to the list.

21.2.2 __meta__

HTTPie automatically stores some of its metadata here. Please do not change.

21.3 Un-setting previously specified options

Default options from the config file, or specified any other way, can be unset for a particular invocation via --no-OPTION arguments passed on the command line (eg, --no-style or --no-session ).

22 Scripting

When using HTTPie from shell scripts, it can be handy to set the --check-status flag. It instructs HTTPie to exit with an error if the HTTP status is one of 3xx , 4xx , or 5xx . The exit status will be 3 (unless --follow is set), 4 , or 5 , respectively.

#!/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

22.1 Best practices

The default behaviour of automatically reading stdin is typically not desirable during non-interactive invocations. You most likely want use the --ignore-stdin option to disable it.

It is a common gotcha that without this option HTTPie seemingly hangs. What happens is that when HTTPie is invoked for example from a cron job, stdin is not connected to a terminal. Therefore, rules for redirected input apply, ie, HTTPie starts to read it expecting that the request body will be passed through. And since there’s no data nor EOF , it will be stuck. So unless you’re piping some data to HTTPie, this flag should be used in scripts.

Also, it might be good to override the default 30 second --timeout to something that suits you.

23 Meta

23.1 Interface design

The syntax of the command arguments closely corresponds to the actual HTTP requests sent over the wire. It has the advantage that it’s easy to remember and read. It is often possible to translate an HTTP request to an HTTPie argument list just by inlining the request elements. For example, compare this HTTP request:

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

with the HTTPie command that sends it:

$ http -f POST example.org/collection \
  X-API-Key:123 \
  User-Agent:Bacon/1.0 \
  name=value \
  name2=value2

Notice that both the order of elements and the syntax is very similar, and that only a small portion of the command is used to control HTTPie and doesn’t directly correspond to any part of the request (here it’s only -f asking HTTPie to send a form request).

The two modes, --pretty=all (default for terminal) and --pretty=none (default for redirected output), allow for both user-friendly interactive use and usage from scripts, where HTTPie serves as a generic HTTP client.

As HTTPie is still under heavy development, the existing command line syntax and some of the --OPTIONS may change slightly before HTTPie reaches its final version 1.0 . All changes are recorded in the change log .

23.2 User support

Please use the following support channels:

23.3 Related projects

23.3.1 Dependencies

Under the hood, HTTPie uses these two amazing libraries:

  • Requests — Python HTTP library for humans
  • Pygments — Python syntax highlighter

23.3.2 HTTPie friends

HTTPie plays exceptionally well with the following tools:

  • jq — CLI JSON processor that works great in conjunction with HTTPie
  • http-prompt — interactive shell for HTTPie featuring autocomplete and command syntax highlighting

23.3.3 Alternatives

  • httpcat — a lower-level sister utility of HTTPie for constructing raw HTTP requests on the command line.
  • curl — a “Swiss knife” command line tool and an exceptional library for transferring data with URLs.

23.4 Contributing

See CONTRIBUTING.rst .

23.5 Change log

See CHANGELOG .

23.6 Artwork

See claudiatd/httpie-artwork

23.7 Licence

BSD-3-Clause: LICENSE .

23.8 Authors

Jakub Roztocil ( @jakubroztocil ) created HTTPie and these fine people have contributed.







-jakubroztocil
-, , , , , , , , , , , , , , , , , , ,

執筆者: