HTTPie (pronounced aitch-tee-tee-pie) is a command-line HTTP client.
Its goal is to make CLI interaction with web services as human-friendly as possible.
HTTPie is designed for testing, debugging, and generally interacting with APIs & HTTP servers.
The http & https commands allow for creating and sending arbitrary HTTP requests.
They use simple and natural syntax and provide formatted and colorized output.
Main features
- Expressive and intuitive syntax
- Formatted and colorized terminal output
- Built-in JSON support
- Forms and file uploads
- HTTPS, proxies, and authentication
- Arbitrary request data
- Custom headers
- Persistent sessions
- Wget-like downloads
- Linux, macOS, Windows, and FreeBSD support
- Plugins
- Documentation
- Test coverage
Installation
Universal
PyPI
Please make sure you have Python 3.7 or newer (python --version).
# Install httpie
$ python -m pip install --upgrade pip wheel
$ python -m pip install httpie# Upgrade httpie
$ python -m pip install --upgrade pip wheel
$ python -m pip install --upgrade httpiemacOS
Homebrew
To install Homebrew, see its installation.
# Install httpie
$ brew update
$ brew install httpie# Upgrade httpie
$ brew update
$ brew upgrade httpieMacPorts
To install MacPorts, see its installation.
# Install httpie
$ port selfupdate
$ port install httpie# Upgrade httpie
$ port selfupdate
$ port upgrade httpieWindows
Chocolatey
To install Chocolatey, see its installation.
# Install httpie
$ choco install httpie# Upgrade httpie
$ choco upgrade httpieLinux
Debian and Ubuntu
Also works for other Debian-derived distributions like MX Linux, Linux Mint, deepin, Pop!_OS, KDE neon, Zorin OS, elementary OS, Kubuntu, Devuan, Linux Lite, Peppermint OS, Lubuntu, antiX, Xubuntu, etc.
# Install httpie
$ curl -SsL https://packages.httpie.io/deb/KEY.gpg | sudo gpg --dearmor -o /usr/share/keyrings/httpie.gpg
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/httpie.gpg] https://packages.httpie.io/deb ./" | sudo tee /etc/apt/sources.list.d/httpie.list > /dev/null
$ sudo apt update
$ sudo apt install httpie# Upgrade httpie
$ sudo apt update && sudo apt upgrade httpieFedora
# Install httpie
$ dnf install httpie# Upgrade httpie
$ dnf upgrade httpieCentOS and RHEL
Also works for other RHEL-derived distributions like ClearOS, Oracle Linux, etc.
# Install httpie
$ yum install epel-release
$ yum install httpie# Upgrade httpie
$ yum upgrade httpieSingle binary executables
Get the standalone HTTPie Linux executables when you don't want to go through the full installation process.
# Install httpie
$ https --download packages.httpie.io/binaries/linux/http-latest -o http
$ ln -ls ./http ./https
$ chmod +x ./http ./https# Upgrade httpie
$ https --download packages.httpie.io/binaries/linux/http-latest -o httpSnapcraft (Linux)
To install Snapcraft, see its installation.
# Install httpie
$ snap install httpie# Upgrade httpie
$ snap refresh httpieLinuxbrew
To install Linuxbrew, see its installation.
# Install httpie
$ brew update
$ brew install httpie# Upgrade httpie
$ brew update
$ brew upgrade httpieArch Linux
Also works for other Arch-derived distributions like ArcoLinux, EndeavourOS, Artix Linux, etc.
# Install httpie
$ pacman -Syu httpie# Upgrade httpie
$ pacman -SyuFreeBSD
FreshPorts
# Install httpie
$ pkg install www/py-httpie# Upgrade httpie
$ pkg upgrade www/py-httpieUnstable version
If you want to try out the latest version of HTTPie that hasn't been officially released yet, you can install the development or unstable version directly from the master branch on GitHub. However, keep in mind that the development version is a work in progress and may not be as reliable as the stable version.
You can use the following command to install the development version of HTTPie on Linux, macOS, Windows, or FreeBSD operating systems. With this command, the code present in the master branch is downloaded and installed using pip.
$ python -m pip install --upgrade https://github.com/httpie/cli/archive/master.tar.gzThere are other ways to install the development version of HTTPie on macOS and Linux.
You can install it using Homebrew by running the following commands:
$ brew uninstall --force httpie
$ brew install --HEAD httpieYou can install it using Snapcraft by running the following commands:
$ snap remove httpie
$ snap install httpie --edgeTo verify the installation, you can compare the version identifier on GitHub with the one available on your machine. You can check the version of HTTPie on your machine by using the command http --version.
$ http --version
# 3.X.X.dev0Note that on your machine, the version name will have the .dev0 suffix.
Usage
Hello World:
$ https httpie.io/helloSynopsis:
$ http [flags] [METHOD] URL [ITEM [ITEM]]See also http --help (and for systems where man pages are available, you can use man http).
Examples
Custom HTTP method, HTTP headers and JSON data:
$ http PUT pie.dev/put X-API-Token:123 name=JohnSubmitting forms:
$ http -f POST pie.dev/post hello=WorldSee the request that is being sent using one of the output options:
$ http -v pie.dev/getBuild and print a request without sending it using offline mode:
$ http --offline pie.dev/post hello=offlineUse GitHub API to post a comment on an issue with authentication:
$ http -a USERNAME POST https://api.github.com/repos/httpie/cli/issues/83/comments body='HTTPie is awesome! :heart:'Upload a file using redirected input:
$ http pie.dev/post < files/data.jsonDownload a file and save it via redirected output:
$ http pie.dev/image/png > image.pngDownload a file wget style:
$ http --download pie.dev/image/pngUse named sessions to make certain aspects of the communication persistent between requests to the same host:
$ http --session=logged-in -a username:password pie.dev/get API-Key:123$ http --session=logged-in pie.dev/headersSet a custom Host header to work around missing DNS records:
$ http localhost:8000 Host:example.comHTTP method
The name of the HTTP method comes right before the URL argument:
$ http DELETE pie.dev/deleteWhich looks similar to the actual Request-Line that is sent:
DELETE /delete HTTP/1.1In addition to the standard methods (GET, POST, HEAD, PUT, PATCH, DELETE, etc.), you can use custom method names, for example:
$ http AHOY pie.dev/postThere are no restrictions regarding which request methods can include a body. You can send an empty POST request:
$ http POST pie.dev/postYou can also make GET requests containing a body:
$ http GET pie.dev/get hello=worldOptional GET and POST
The METHOD argument is optional, and when you don’t specify it, HTTPie defaults to:
GETfor requests without bodyPOSTfor requests with body
Here we don’t specify any request data, so both commands will send the same GET request:
$ http GET pie.dev/get$ http pie.dev/getHere, on the other hand, we do have some data, so both commands will make the same POST request:
$ http POST pie.dev/post hello=world$ http pie.dev/post hello=worldRequest URL
The only information HTTPie needs to perform a request is a URL.
The default scheme is http:// and can be omitted from the argument:
$ http example.org
# → http://example.orgHTTPie also installs an https executable, where the default scheme is https://:
$ https example.org
# → https://example.orgWhen you paste a URL into the terminal, you can even keep the :// bit in the URL argument to quickly convert the URL into an HTTPie call just by adding a space after the protocol name.
$ https ://example.org
# → https://example.org$ http ://example.org
# → http://example.orgQuerystring parameters
If you find yourself manually constructing URLs with querystring parameters on the terminal, you may appreciate the param==value syntax for appending URL parameters.
With that, you don’t have to worry about escaping the & separators for your shell. Additionally, any special characters in the parameter name or value get automatically URL-escaped (as opposed to the parameters specified in the full URL, which HTTPie doesn’t modify).
$ http https://api.github.com/search/repositories q==httpie per_page==1GET /search/repositories?q=httpie&per_page=1 HTTP/1.1You can even retrieve the value from a file by using the param==@file syntax. This would also effectively strip the newlines from the end. See file based separators for more examples.
$ http pie.dev/get text==@files/text.txtURL shortcuts for localhost
Additionally, curl-like shorthand for localhost is supported.
This means that, for example, :3000 would expand to http://localhost:3000.
If the port is omitted, then port 80 is assumed.
$ http :/fooGET /foo HTTP/1.1
Host: localhost$ http :3000/barGET /bar HTTP/1.1
Host: localhost:3000$ http :GET / HTTP/1.1
Host: localhostOther default schemes
When HTTPie is invoked as https then the default scheme is https:// ($ https example.org will make a request to https://example.org).
You can also use the --default-scheme <URL_SCHEME> option to create shortcuts for other protocols than HTTP (possibly supported via plugins). Example for the httpie-unixsocket plugin:
# Before
$ http http+unix://%2Fvar%2Frun%2Fdocker.sock/info# Create an alias
$ alias http-unix='http --default-scheme="http+unix"'# Now the scheme can be omitted
$ http-unix %2Fvar%2Frun%2Fdocker.sock/info--path-as-is
The standard behavior of HTTP clients is to normalize the path portion of URLs by squashing dot segments as a typical filesystem would:
$ http -v example.org/./../../etc/passwordGET /etc/password HTTP/1.1The --path-as-is option allows you to disable this behavior:
$ http --path-as-is -v example.org/./../../etc/passwordGET /../../etc/password HTTP/1.1Request items
There are a few different request item types that provide a convenient mechanism for specifying HTTP headers, JSON and form data, files, and URL parameters. This is a very practical way of constructing HTTP requests from scratch on the CLI.
Each request item is simply a key/value pair separated with the following
characters: : (headers), = (data field, e.g., JSON, form), := (raw data field)
== (query parameters), @ (file upload).
$ http PUT pie.dev/put \
X-Date:today \ # Header
token==secret \ # Query parameter
name=John \ # Data field
age:=29 # Raw JSON| Item Type | Description |
|---|---|
HTTP Headers Name:Value | Arbitrary HTTP header, e.g. X-API-Token:123 |
URL parameters name==value | Appends the given name/value pair as a querystring parameter to the URL. The == separator is used. |
Data Fields field=value | Request data fields to be serialized as a JSON object (default), to be form-encoded (with --form, -f), or to be serialized as multipart/form-data (with --multipart) |
Raw JSON fields field:=json | Useful when sending JSON and one or more fields need to be a Boolean, Number, nested Object, or an Array, e.g., meals:='["ham","spam"]' or pies:='[1,2,3]' (note the quotes) |
File upload fields field@/dir/file, field@file;type=mime | Only available with --form, -f and --multipart. For example screenshot@~/Pictures/img.png, or '[email protected];type=text/markdown'. With --form, the presence of a file field results in a --multipart request |
Note that the structured data fields aren’t the only way to specify request data: raw request body is a mechanism for passing arbitrary request data.
File based separators
Using file contents as values for specific fields is a very common use case, which can be achieved through adding the @ suffix to
the operators above. For example, instead of using a static string as the value for some header, you can use :@ operator
to pass the desired value from a file.
$ http POST pie.dev/post \
X-Data:@files/text.txt # Read a header from a file
token==@files/text.txt # Read a query parameter from a file
name=@files/text.txt # Read a data field’s value from a file
bookmarks:=@files/data.json # Embed a JSON object from a fileEscaping rules
You can use \ to escape characters that shouldn’t be used as separators (or parts thereof). For instance, foo\==bar will become a data key/value pair (foo= and bar) instead of a URL parameter.
Often it is necessary to quote the values, e.g. foo='bar baz'.
If any of the field names or headers starts with a minus (e.g. -fieldname), you need to place all such items after the special token -- to prevent confusion with --arguments:
$ http pie.dev/post -- -name-starting-with-dash=foo -Unusual-Header:barPOST /post HTTP/1.1
-Unusual-Header: bar
Content-Type: application/json
{
"-name-starting-with-dash": "foo"
}JSON
JSON is the lingua franca of modern web services, and it is also the implicit content type HTTPie uses by default.
Simple example:
$ http PUT pie.dev/put name=John [email protected]PUT / HTTP/1.1
Accept: application/json, */*;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json
Host: pie.dev
{
"name": "John",
"email": "[email protected]"
}Default behavior
If your command includes some data request items, they are serialized as a JSON object by default. HTTPie also automatically sets the following headers, both of which can be overwritten:
| Header | Value |
|---|---|
Content-Type | application/json |
Accept | application/json, */*;q=0.5 |
Explicit JSON
You can use --json, -j to explicitly set Accept to application/json regardless of whether you are sending data (it’s a shortcut for setting the header via the usual header notation: http url Accept:'application/json, */*;q=0.5').
Additionally, HTTPie will try to detect JSON responses even when the Content-Type is incorrectly text/plain or unknown.
Non-string JSON fields
Non-string JSON fields use the := separator, which allows you to embed arbitrary JSON data into the resulting JSON object.
Additionally, text and raw JSON files can also be embedded into fields using =@ and :=@:
$ http PUT pie.dev/put \
name=John \ # String (default)
age:=29 \ # Raw JSON — Number
married:=false \ # Raw JSON — Boolean
hobbies:='["http", "pies"]' \ # Raw JSON — Array
favorite:='{"tool": "HTTPie"}' \ # Raw JSON — Object
bookmarks:=@files/data.json \ # Embed JSON file
description=@files/text.txt # Embed text filePUT /person/1 HTTP/1.1
Accept: application/json, */*;q=0.5
Content-Type: application/json
Host: pie.dev
{
"age": 29,
"hobbies": [
"http",
"pies"
],
"description": "John is a nice guy who likes pies.",
"married": false,
"name": "John",
"favorite": {
"tool": "HTTPie"
},
"bookmarks": {
"HTTPie": "https://httpie.org",
}
}The :=/:=@ syntax is JSON-specific. You can switch your request to --form or --multipart,
and string, float, and number values will continue to be serialized (as string form values).
Other JSON types, however, are not allowed with --form or --multipart.
Nested JSON
If your use case involves sending complex JSON objects as part of the request body,
HTTPie can help you build them right from your terminal. You still use the existing
data field operators (=/:=) but instead of specifying a top-level field name (like key=value),
you specify a path declaration. This tells HTTPie where and how to put the given value inside an object:
http pie.dev/post \
platform[name]=HTTPie \
platform[about][mission]='Make APIs simple and intuitive' \
platform[about][homepage]=httpie.io \
platform[about][homepage]=httpie.io \
platform[about][stars]:=54000 \
platform[apps][]=Terminal \
platform[apps][]=Desktop \
platform[apps][]=Web \
platform[apps][]=Mobile{
"platform": {
"name": "HTTPie",
"about": {
"mission": "Make APIs simple and intuitive",
"homepage": "httpie.io",
"stars": 54000
},
"apps": [
"Terminal",
"Desktop",
"Web",
"Mobile"
]
}
}Introduction
Let’s start with a simple example, and build a simple search query:
$ http --offline --print=B pie.dev/post \
category=tools \
search[type]=id \
search[id]:=1In the example above, the search[type] is an instruction for creating an object called search, and setting the type field of it to the given value ("id").
Also note that, just as the regular syntax, you can use the := operator to directly pass raw JSON values (e.g., numbers in the case above).
{
"category": "tools",
"search": {
"id": 1,
"type": "id"
}
}Building arrays is also possible, through [] suffix (an append operation). This tells HTTPie to create an array in the given path (if there is not one already), and append the given value to that array.
$ http --offline --print=B pie.dev/post \
category=tools \
search[type]=keyword \
search[keywords][]=APIs \
search[keywords][]=CLI{
"category": "tools",
"search": {
"keywords": [
"APIs",
"CLI"
],
"type": "keyword"
}
}If you want to explicitly specify the position of elements inside an array, you can simply pass the desired index as the path:
$ http --offline --print=B pie.dev/post \
category=tools \
search[type]=keyword \
search[keywords][1]=APIs \
search[keywords][0]=CLI{
"category": "tools",
"search": {
"keywords": [
"CLIs",
"API"
],
"type": "keyword"
}
}If there are any missing indexes, HTTPie will nullify them in order to create a concrete object that can be sent:
$ http --offline --print=B pie.dev/post \
category=tools \
search[type]=platforms \
search[platforms][]=Terminal \
search[platforms][1]=Desktop \
search[platforms][3]=Mobile{
"category": "tools",
"search": {
"platforms": [
"Terminal",
"Desktop",
null,
"Mobile"
],
"type": "platforms"
}
}It is also possible to embed raw JSON to a nested structure, for example:
$ http --offline --print=B pie.dev/post \
category=tools \
search[type]=platforms \
'search[platforms]:=["Terminal", "Desktop"]' \
search[platforms][]=Web \
search[platforms][]=Mobile{
"category": "tools",
"search": {
"platforms": [
"Terminal",
"Desktop",
"Web",
"Mobile"
],
"type": "platforms"
}
}And just to demonstrate all of these features together, let’s create a very deeply nested JSON object:
$ http PUT pie.dev/put \
shallow=value \ # Shallow key-value pair
object[key]=value \ # Nested key-value pair
array[]:=1 \ # Array — first item
array[1]:=2 \ # Array — second item
array[2]:=3 \ # Array — append (third item)
very[nested][json][3][httpie][power][]=Amaze # Nested objectAdvanced usage
Top level arrays
If you want to send an array instead of a regular object, you can simply do that by omitting the starting key:
$ http --offline --print=B pie.dev/post \
[]:=1 \
[]:=2 \
[]:=3[
1,
2,
3
]You can also apply the nesting to the items by referencing their index:
http --offline --print=B pie.dev/post \
[0][type]=platform [0][name]=terminal \
[1][type]=platform [1][name]=desktop[
{
"type": "platform",
"name": "terminal"
},
{
"type": "platform",
"name": "desktop"
}
]Sending scalar JSON types (a single null, true, false, string or number) as the top-level object is impossible using the key/value syntax. But you can still pass it via --raw='<value>'.
Escaping behavior
Nested JSON syntax uses the same escaping rules as the terminal. There are 3 special characters, and 1 special token that you can escape.
If you want to send a bracket as is, escape it with a backslash (\):
$ http --offline --print=B pie.dev/post \
'foo\[bar\]:=1' \
'baz[\[]:=2' \
'baz[\]]:=3'{
"baz": {
"[": 2,
"]": 3
},
"foo[bar]": 1
}If you want to send the literal backslash character (\), escape it with another backslash:
$ http --offline --print=B pie.dev/post \
'backslash[\\]:=1'{
"backslash": {
"\\": 1
}
}A regular integer in a path (e.g [10]) means an array index; but if you want it to be treated as
a string, you can escape the whole number by using a backslash (\) prefix.
$ http --offline --print=B pie.dev/post \
'object[\1]=stringified' \
'object[\100]=same' \
'array[1]=indexified'{
"array": [
null,
"indexified"
],
"object": {
"1": "stringified",
"100": "same"
}
}Guiding syntax errors
If you make a typo or forget to close a bracket, the errors will guide you to fix it. For example:
$ http --offline --print=B pie.dev/post \
'foo[bar]=OK' \
'foo[baz][quux=FAIL'HTTPie Syntax Error: Expecting ']'
foo[baz][quux
^You can follow to given instruction (adding a ]) and repair your expression.
Type safety
Each container path (e.g., x[y][z] in x[y][z][1]) has a certain type, which gets defined with
the first usage and can’t be changed after that. If you try to do a key-based access to an array or
an index-based access to an object, HTTPie will error out:
$ http --offline --print=B pie.dev/post \
'array[]:=1' \
'array[]:=2' \
'array[key]:=3'
HTTPie Type Error: Can't perform 'key' based access on 'array' which has a type of 'array' but this operation requires a type of 'object'.
array[key]
^^^^^Type Safety does not apply to value overrides, for example:
$ http --offline --print=B pie.dev/post \
user[name]:=411 # Defined as an integer
user[name]=string # Overridden with a string{
"user": {
"name": "string"
}
}Raw JSON
For very complex JSON structures, it may be more convenient to pass it as raw request body, for example:
$ echo -n '{"hello": "world"}' | http POST pie.dev/post$ http POST pie.dev/post < files/data.jsonForms
Submitting forms is very similar to sending JSON requests.
Often the only difference is in adding the --form, -f option, which ensures that data fields are serialized as key-value tuples separated by '&', with a '=' between the key and the value. In addition Content-Type is set to application/x-www-form-urlencoded; charset=utf-8.
It is possible to make form data the implicit content type instead of JSON via the config file.
Regular forms
$ http --form POST pie.dev/post name='John Smith'POST /post HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=utf-8
name=John+SmithFile upload forms
If one or more file fields is present, the serialization and content type is multipart/form-data:
$ http -f POST pie.dev/post name='John Smith' cv@~/files/data.xmlThe request above is the same as if the following HTML form were submitted:
<form enctype="multipart/form-data" method="post" action="http://example.com/jobs">
<input type="text" name="name" />
<input type="file" name="cv" />
</form>Please note that @ is used to simulate a file upload form field, whereas =@ just embeds the file content as a regular text field value.
When uploading files, their content type is inferred from the file name. You can manually override the inferred content type:
$ http -f POST pie.dev/post name='John Smith' cv@'~/files/data.bin;type=application/pdf'To perform a multipart/form-data request even without any files, use --multipart instead of --form:
$ http --multipart --offline example.org hello=worldPOST / HTTP/1.1
Content-Length: 129
Content-Type: multipart/form-data; boundary=c31279ab254f40aeb06df32b433cbccb
Host: example.org
--c31279ab254f40aeb06df32b433cbccb
Content-Disposition: form-data; name="hello"
world
--c31279ab254f40aeb06df32b433cbccb--File uploads are always streamed to avoid memory issues with large files.
By default, HTTPie uses a random unique string as the multipart boundary, but you can use --boundary to specify a custom string instead:
$ http --form --multipart --boundary=xoxo --offline example.org hello=worldPOST / HTTP/1.1
Content-Length: 129
Content-Type: multipart/form-data; boundary=xoxo
Host: example.org
--xoxo
Content-Disposition: form-data; name="hello"
world
--xoxo--If you specify a custom Content-Type header without including the boundary bit, HTTPie will add the boundary value (explicitly specified or auto-generated) to the header automatically:
$ http --form --multipart --offline example.org hello=world Content-Type:multipart/letterPOST / HTTP/1.1
Content-Length: 129
Content-Type: multipart/letter; boundary=c31279ab254f40aeb06df32b433cbccb
Host: example.org
--c31279ab254f40aeb06df32b433cbccb
Content-Disposition: form-data; name="hello"
world
--c31279ab254f40aeb06df32b433cbccb--HTTP headers
To set custom headers you can use the Header:Value notation:
$ http pie.dev/headers User-Agent:Bacon/1.0 'Cookie:valued-visitor=yes;foo=bar' \
X-Foo:Bar Referer:https://httpie.org/GET /headers HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Cookie: valued-visitor=yes;foo=bar
Host: pie.dev
Referer: https://httpie.org/
User-Agent: Bacon/1.0
X-Foo: BarDefault request headers
There are a couple of default headers that HTTPie sets:
GET / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: HTTPie/<version>
Host: <taken-from-URL>All of these can be overwritten or unset (see below).
Reading headers from a file
You can read headers from a file by using the :@ operator. This would also effectively strip the newlines from the end. See file based separators for more examples.
$ http pie.dev/headers X-Data:@files/text.txtEmpty headers and header un-setting
To unset a previously specified header (such a one of the default headers), use Header::
$ http pie.dev/headers Accept: User-Agent:To send a header with an empty value, use Header;, with a semicolon:
$ http pie.dev/headers 'Header;'Please note that some internal headers, such as Content-Length, can’t be unset if
they are automatically added by the client itself.
Multiple header values with the same name
If the request is sent with multiple headers that are sharing the same name, then the HTTPie will send them individually.
http --offline example.org Cookie:one Cookie:twoGET / HTTP/1.1
Cookie: one
Cookie: twoIt is also possible to pass a single header value pair, where the value is a comma separated list of header values. Then the client will send it as a single header.
http --offline example.org Numbers:one,twoGET / HTTP/1.1
Numbers: one,twoAlso be aware that if the current session contains any headers they will get overwritten by individual commands when sending a request instead of being joined together.
Limiting response headers
The --max-headers=n option allows you to control the number of headers HTTPie reads before giving up (the default 0, i.e., there’s no limit).
$ http --max-headers=100 pie.dev/getOffline mode
Use --offline to construct HTTP requests without sending them anywhere.
With --offline, HTTPie builds a request based on the specified options and arguments, prints it to stdout, and then exits. It works completely offline; no network connection is ever made. This has a number of use cases, including:
Generating API documentation examples that you can copy & paste without sending a request:
$ http --offline POST server.chess/api/games API-Key:ZZZ w=magnus b=hikaru t=180 i=2$ http --offline MOVE server.chess/api/games/123 API-Key:ZZZ p=b a=R1a3 t=77Generating raw requests that can be sent with any other client:
# 1. save a raw request to a file:
$ http --offline POST pie.dev/post hello=world > request.http# 2. send it over the wire with, for example, the fantastic netcat tool:
$ nc pie.dev 80 < request.httpYou can also use the --offline mode for debugging and exploring HTTP and HTTPie, and for “dry runs”.
--offline has the side effect of automatically activating --print=HB, i.e., both the request headers and the body
are printed. You can customize the output with the usual output options, with the exception where there
is no response to be printed. You can use --offline in combination with all the other options (e.g. --session).
Cookies
HTTP clients send cookies to the server as regular HTTP headers.
That means, HTTPie does not offer any special syntax for specifying cookies — the usual Header:Value notation is used:
Send a single cookie:
$ http pie.dev/cookies Cookie:sessionid=fooGET / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: sessionid=foo
Host: pie.dev
User-Agent: HTTPie/0.9.9Send multiple cookies (note: the header is quoted to prevent the shell from interpreting the ;):
$ http pie.dev/cookies 'Cookie:sessionid=foo;another-cookie=bar'GET / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: sessionid=foo;another-cookie=bar
Host: pie.dev
User-Agent: HTTPie/0.9.9If you often deal with cookies in your requests, then you’d appreciate the sessions feature.
Authentication
The currently supported authentication schemes are Basic and Digest (see auth plugins for more). There are two flags that control authentication:
| Flag | Arguments |
|---|---|
--auth, -a | Pass either a username:password pair or a token as the argument. If the selected authenticated method requires username/password combination and if you only specify a username (-a username), you’ll be prompted for the password before the request is sent. To send an empty password, pass username:. The username:password@hostname URL syntax is supported as well (but credentials passed via -a have higher priority) |
--auth-type, -A | Specify the auth mechanism. Possible values are basic, digest, bearer or the name of any auth plugins you have installed. The default value is basic so it can often be omitted |
Basic auth
$ http -a username:password pie.dev/basic-auth/username/passwordDigest auth
$ http -A digest -a username:password pie.dev/digest-auth/httpie/username/password