Python - Requests Library

Introduction

The article explains the ‘requests’ library, it’s a simple HTTP library for Python, it’s very elegant and within a few lines of code, we can develop a proper REST client. In this tutorial, we will invoke the public REST API to check the current weather of any request city.

URL: https://goweather.herokuapp.com/weather/{city}

Installation

For installing the requests library, we can use either

pip install requests

Or if you are using Anaconda, then simply find and install the 'requests' package.

GET

The most common HTTP method is GET, which indicates that the user is requesting a resource from the server. We will check the current weather of ‘New York’ right now using the ‘requests’ library.

import requests
response = requests.get('https://goweather.herokuapp.com/weather/NewYork')
response

Output: <Response 200>

The .get method returns a Response object, which contains the results returned by the GET operation. 'status_code' returns the status of the request returned by the server, for example

response.status_code // returns 200

If we don’t pass city in the request, the result is 404

import requests
response = requests.get('https://goweather.herokuapp.com/weather/')
response

We can modify our code

import requests
response = requests.get('https://goweather.herokuapp.com/weather/NewYork')
if(response.status_code == 200):
    print('Success: Response Found')
else:
    print('Failed: Response not found')

To get the response reason, we should be using 'response.reason' which in this case returns ‘OK’.

response = requests.get('https://goweather.herokuapp.com/weather/NewYork')
response.reason

The 'status_code' only returns the status code, how about the Payload which is returned by the service, how to access that.

.content: The .content returns response in bytes,

response = requests.get('https://goweather.herokuapp.com/weather/NewYork')
response.content
'{"temperature":"+2 \xc2\xb0C",
"wind":"26 km/h",
"description":"Partly cloudy",
"forecast":[{"day":"1","temperature":"+2 \xc2\xb0C","wind":"14 km/h"},
{"day":"2","temperature":"+7 \xc2\xb0C","wind":"6 km/h"},
{"day":"3","temperature":"+7 \xc2\xb0C","wind":"13 km/h"}]}'

.text: using response.text, we get the response in String

response = requests.get('https://goweather.herokuapp.com/weather/NewYork')
response.text
'{"temperature":"+2 °C",
"wind":"26 km/h","description":"Partly cloudy",
"forecast":[{"day":"1","temperature":"+2 °C","wind":"14 km/h"},
{"day":"2","temperature":"+7 °C","wind":"6 km/h"},
{"day":"3","temperature":"+7 °C","wind":"13 km/h"}]}'

.json() gives us the response in JSON format

response = requests.get('https://goweather.herokuapp.com/weather/NewYork')
response.json()
{'temperature': '+2 °C',
 'wind': '26 km/h',
 'description': 'Partly cloudy',
 'forecast': [{'day': '1', 'temperature': '+2 °C', 'wind': '14 km/h'},
  {'day': '2', 'temperature': '+7 °C', 'wind': '6 km/h'},
  {'day': '3', 'temperature': '+7 °C', 'wind': '13 km/h'}]}

response.headers(): returns the headers of the response, in dictionary format.

response = requests.get('https://goweather.herokuapp.com/weather/NewYork')
response.headers
{'Server': 'Cowboy', 
'Connection': 'keep-alive', 
'Content-Type': 'application/json', 
'Date': 'Thu, 23 Dec 2021 18:00:08 GMT', 
'Content-Length': '239', 'Via': '1.1 vegur'}

To access any header element

response.headers['Content-Length'] //239

Proper GET request

In general, we need to pass the headers and sometimes the parameters for sending a REST request, the header may contain any info like customerId, Accept sometimes versioning, we should supply such information in the request header, for doing that in requests library the format is

response = requests.get(
    'https://goweather.herokuapp.com/weather/NewYork',
    headers={'Accept': 'application/json'},
)

For parameters, we should be passing ‘params’ in the request.

Other HTTP Methods

The other HTTP methods like ‘POST’, ‘PUT’, ‘DELETE’  has a very similar signature, although the current weather API we are using supports only GET operations for other operations to imagine a REST service called Employee Rest Service

requests.post('/employee', data={"empName": "John"})
requests.put(('/employee/20', data={"empName": "John"})
requests.delete('/employee/20');

The requests library is extremely efficient and very elegant to work with, I recommend using it if you want to write your own REST client, irrespective of your service which is written in Java or Python. 

Thank You for reading