# Requests The core elements of an HTTP request are the `method`, `url`, `headers` and `body`.
httpx
```{ .python .httpx } >>> req = httpx.Request('GET', 'https://www.example.com/') >>> req >>> req.method 'GET' >>> req.url >>> req.headers >>> req.body b'' ``` ```{ .python .ahttpx .hidden } >>> req = ahttpx.Request('GET', 'https://www.example.com/') >>> req >>> req.method 'GET' >>> req.url >>> req.headers >>> req.body b'' ``` ## Working with the request headers The following headers have automatic behavior with `Requests` instances... * `Host` - A `Host` header must always be included on a request. This header is automatically populated from the `url`, using the `url.netloc` property. * `Content-Length` - Requests including a request body must always include either a `Content-Length` header or a `Transfer-Encoding: chunked` header. This header is automatically populated if `content` is not `None` and the content is a known size. * `Transfer-Encoding` - Requests automatically include a `Transfer-Encoding: chunked` header if `content` is not `None` and the content is an unkwown size. * `Content-Type` - Requests automatically include a `Content-Type` header if `content` is set using the [Content Type] API. ## Working with the request body Including binary data directly... ```{ .python .httpx } >>> headers = {'Content-Type': 'application/json'} >>> content = json.dumps(...) >>> httpx.Request('POST', 'https://echo.encode.io/', content=content) ``` ```{ .python .ahttpx .hidden } >>> headers = {'Content-Type': 'application/json'} >>> content = json.dumps(...) >>> ahttpx.Request('POST', 'https://echo.encode.io/', content=content) ``` ## Working with content types Including JSON request content... ```{ .python .httpx } >>> data = httpx.JSON(...) >>> httpx.Request('POST', 'https://echo.encode.io/', content=data) ``` ```{ .python .ahttpx .hidden } >>> data = ahttpx.JSON(...) >>> ahttpx.Request('POST', 'https://echo.encode.io/', content=data) ``` Including form encoded request content... ```{ .python .httpx } >>> data = httpx.Form(...) >>> httpx.Request('PUT', 'https://echo.encode.io/', content=data) ``` ```{ .python .ahttpx .hidden } >>> data = ahttpx.Form(...) >>> ahttpx.Request('PUT', 'https://echo.encode.io/', content=data) ``` Including multipart file uploads... ```{ .python .httpx } >>> form = httpx.MultiPart(form={...}, files={...}) >>> with httpx.Request('POST', 'https://echo.encode.io/', content=form) as req: >>> req.headers {...} >>> req.stream ``` ```{ .python .ahttpx .hidden } >>> form = ahttpx.MultiPart(form={...}, files={...}) >>> async with ahttpx.Request('POST', 'https://echo.encode.io/', content=form) as req: >>> req.headers {...} >>> req.stream ``` Including direct file uploads... ```{ .python .httpx } >>> file = httpx.File('upload.json') >>> with httpx.Request('POST', 'https://echo.encode.io/', content=file) as req: >>> req.headers {...} >>> req.stream ``` ```{ .python .ahttpx .hidden } >>> file = ahttpx.File('upload.json') >>> async with ahttpx.Request('POST', 'https://echo.encode.io/', content=file) as req: >>> req.headers {...} >>> req.stream ``` ## Accessing request content *In progress...* ```{ .python .httpx } >>> data = request.json() ``` ```{ .python .ahttpx .hidden } >>> data = await request.json() ``` ... ```{ .python .httpx } >>> form = request.form() ``` ```{ .python .ahttpx .hidden } >>> form = await request.form() ``` ... ```{ .python .httpx } >>> files = request.files() ``` ```{ .python .ahttpx .hidden } >>> files = await request.files() ``` --- ← [Servers](servers.md) [Responses](responses.md) →