In this tutorial, you’ll learn how to use custom headers with the Python requests
library. HTTP headers allow you to send additional information to a server and allow the server to provide additional information back to you. Being able to work with headers allows you to, for example, authenticate yourself when working with APIs or inform the request which content type your application is expecting.
By the end of this tutorial, you’ll have learned:
- What HTTP headers are and what they are used for
- How to pass custom headers in a Python
requests
request, such asGET
orPOST
requests - How to see headers that are returned in a Python
requests
response
Table of Contents
Understanding HTTP Headers and How to Use Them
HTTP headers allow the client and server to pass additional information while sending an HTTP request or receiving a subsequent response. These headers are case-insensitive, meaning that the header of 'User-Agent'
could also be written as 'user-agent'
.
Additionally, HTTP headers in the requests
library are passed in using Python dictionaries, where the key represents the header name and the value represents the header value.
HTTP headers are useful for providing information that you expect the server to tailor for you. For example, they can be used to indicate the allowed or preferred formats of a response you’d like back. Similarly, headers can be used to provide information that helps you authenticate yourself in a request that you’re making.
In the following section, you’ll learn how to use the Python requests
library to customize HTTP headers being passed into a GET
request.
How to Pass HTTP Headers into a Python requests GET Request
To pass HTTP headers into a GET
request using the Python requests
library, you can use the headers=
parameter in the .get()
function. The parameter accepts a Python dictionary of key-value pairs, where the key represents the header type and the value is the header value.
Because HTTP headers are case-insensitive, you can pass headers in using any casing. Let’s see how you can pass headers into a requests.get()
function:
# Passing HTTP Heades into a Python requests.get() Function
import requests
url = 'https://httpbin.org/get'
headers = {'Content-Type': 'text/html'}
print(requests.get(url, headers=headers))
# Returns: <Response [200]>
Let’s break down what we did in the code above:
- We declared a
url
variable, holding the endpoint we want to connect to - We declared a dictionary,
headers
, which contained the headers we wanted to pass in - Finally, we used the
requests.get()
function to pass in our headers into theheaders=
parameter.
In the next section, you’ll learn how to pass HTTP headers into a Python requests.post()
function.
How to Pass HTTP Headers into a Python requests POST Request
In order to pass HTTP headers into a POST
request using the Python requests
library, you can use the headers=
parameter in the .post()
function. The headers=
parameter accepts a Python dictionary of key-value pairs, where the key represents the header type and the value is the header value.
Because HTTP headers are case-insensitive, you can pass headers in using any case. Let’s see how you can pass headers into a requests.post()
function:
# Passing HTTP Headers into a Python requests.post() Function
import requests
resp = requests.post(
'https://httpbin.org/post',
headers={"Content-Type": "application/json"})
print(resp)
# Returns: <Response [200]>
Let’s break down what we did in the code block above:
- We imported the
requests
library - We created a response object using the
requests.post()
function - In the function, we passed in a URL. We also passed in a dictionary of headers.
By printing out the response, we were able to see that the response returned a successful 200 response.
How to Check Headers Returned in a Python requests Response Object
In the two previous sections, you learned how to pass headers into both GET
and POST
requests. However, even when you don’t pass in headers, headers will be returned in a Response
object. The headers are accessible via the .headers
attribute, which returns a dictionary.
Let’s see how we can return the headers available in a Response
object:
# Checking the Headers of a Response Object
import requests
response = requests.get('https://httpbin.org/get')
print(response.headers)
# Returns:
# {'Date': 'Wed, 03 Aug 2022 14:12:50 GMT', 'Content-Type': 'application/json', 'Content-Length': '312', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'}
In the code block above, we used a get()
function call to get a Response
object. We then accessed the headers of the response by accessing the .headers
attribute.
You can also access a single header by accessing the key of the dictionary:
# Accessing a Single Header in a Response Object
import requests
response = requests.get('https://httpbin.org/get')
print(response.headers.get('content-type'))
# Returns: application/json
There are two main things to note about the code block above:
- We used the
.get()
method in order to safely return a value. This ensures that, if a key-value pair doesn’t exist, no error is thrown - We were able to access the value without case sensitivity
Conclusion
In this tutorial, you learned how to use headers in the Python requests
library. You first learned what HTTP headers are and what they are used for. Then, you learned how to use these headers in request get()
and post()
functions. Finally, you learned how to access headers in a Python requests Response
object.
Additional Resources
To learn more about related topics, check out the tutorials below:
Thank you for this small help. I currently write on a small FastCGI-based HTTP server (shouldn’t be used without Apache/nginx in front of it). I now try to to find out how I can find out if http or https was used to access it? And is there any major difference between double and single quotes? If I want to log data, I use single for string/boolean and no quotes for integer/float values and put the whole logger string into double-quotes:
logger.debug(“foo=’%s’,bar=%d”, foo, bar)
Hi Roland,
To determine whether HTTP or HTTPS was used to access your FastCGI-based HTTP server, you can check the value of the HTTPS environment variable. In the case of HTTPS, this variable will be set to a non-empty value, while for regular HTTP, it will be either unset or empty. Hope that helps!
Single quotes and double quotes can be used interchangeably and it’s up to personal preference. However, using double quotes allows you to include single quotes within the string without escaping them, and vice versa.