POST
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
The POST
HTTP method sends data to the server. The type of the body of the request is indicated by the Content-Type
header.
The difference between PUT
and POST
is that PUT
is idempotent: calling it once is no different from calling it several times successively (there are no side effects).
Successive identical POST
requests may have additional effects, such as creating the same order several times.
HTML forms typically send data using POST
and this usually results in a change on the server.
For HTML forms the format/encoding of the body content is determined by the enctype
attribute of the <form>
element or the formenctype
attribute of the <input>
or <button>
elements.
The encoding may be one of the following:
-
application/x-www-form-urlencoded
: the keys and values are encoded in key-value tuples separated by an ampersand (&
), with an equals symbol (=
) between the key and the value (e.g.,first-name=Frida&last-name=Kahlo
). Non-alphanumeric characters in both keys and values are percent-encoded: this is the reason why this type is not suitable to use with binary data and you should usemultipart/form-data
for this purpose instead. -
multipart/form-data
: each value is sent as a block of data ("body part"), with a user agent-defined delimiter (for example,boundary="delimiter12345"
) separating each part. The keys are described in theContent-Disposition
header of each part or block of data. text/plain
When the POST
request is sent following a fetch()
call, or for any other reason than an HTML form, the body can be any type.
As described in the HTTP 1.1 specification, POST
is designed to allow a uniform method to cover the following functions:
- Annotation of existing resources
- Posting a message to a bulletin board, newsgroup, mailing list, or similar group of articles
- Adding a new user through a signup form
- Providing a block of data, such as the result of submitting a form, to a data-handling process
- Extending a database through an append operation
Request has body | Yes |
---|---|
Successful response has body | Yes |
Safe | No |
Idempotent | No |
Cacheable | Only if freshness information is included |
Allowed in HTML forms | Yes |
Syntax
POST <request-target>["?"<query>] HTTP/1.1
<request-target>
-
Identifies the target resource of the request when combined with the information provided in the
Host
header. This is an absolute path (e.g.,/path/to/file.html
) in requests to an origin server, and an absolute URL in requests to proxies (e.g.,https://www.example.com/path/to/file.html
). <query>
Optional-
An optional query component preceded by a question-mark
?
. Often used to carry identifying information in the form ofkey=value
pairs.
Examples
URL-encoded form submission
A form using application/x-www-form-urlencoded
content encoding (the default) sends a request where the body contains the form data in key=value
pairs, with each pair separated by an &
symbol, as shown below:
POST /test HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
field1=value1&field2=value2
Multipart form submission
The multipart/form-data
encoding is used when a form includes files or a lot of data.
This request body delineates each part of the form using a boundary string.
An example of a request in this format:
POST /test HTTP/1.1
Host: example.com
Content-Type: multipart/form-data;boundary="delimiter12345"
--delimiter12345
Content-Disposition: form-data; name="field1"
value1
--delimiter12345
Content-Disposition: form-data; name="field2"; filename="example.txt"
value2
--delimiter12345--
The Content-Disposition
header indicates how the form data should be processed, specifying the field name
and filename
, if appropriate.
Specifications
Specification |
---|
HTTP Semantics # POST |
Browser compatibility
BCD tables only load in the browser
See also
- HTTP request methods
- HTTP response status codes
- HTTP headers
Content-Type
headerContent-Disposition
headerGET
method