Creating a Reusable Python HTTP Client with Parent and Child Classes
This tutorial demonstrates how to build a reusable Python HTTP client by defining a base HttpRequest class with standard methods, extending it with a RestApiRequest subclass that adds authentication handling, and provides a complete code example showing GET and POST requests.
First, a parent class HttpRequest is defined to encapsulate basic HTTP methods (GET, POST, PUT, DELETE) using the requests library.
Next, a subclass RestApiRequest inherits from HttpRequest and adds an auth_token attribute for authentication.
The subclass overrides __init__ to accept base_url and an optional auth_token , calling super().__init__(base_url) to initialize the base URL.
All request methods (get, post, put, delete) are overridden to automatically inject an Authorization header when auth_token is present, then delegate to the parent implementation via super() .
Additional helper methods add_auth_token and remove_auth_token are provided to manage the token at runtime.
A complete example shows importing requests , defining both classes, and using the subclass to perform GET and POST calls, printing status codes and JSON responses.
import requests
# 父类
class HttpRequest:
def __init__(self, base_url):
self.base_url = base_url
def get(self, endpoint, params=None, headers=None):
url = f"{self.base_url}/{endpoint}"
response = requests.get(url, params=params, headers=headers)
return response
def post(self, endpoint, data=None, json=None, headers=None):
url = f"{self.base_url}/{endpoint}"
response = requests.post(url, data=data, json=json, headers=headers)
return response
def put(self, endpoint, data=None, json=None, headers=None):
url = f"{self.base_url}/{endpoint}"
response = requests.put(url, data=data, json=json, headers=headers)
return response
def delete(self, endpoint, headers=None):
url = f"{self.base_url}/{endpoint}"
response = requests.delete(url, headers=headers)
return response
# 子类
class RestApiRequest(HttpRequest):
def __init__(self, base_url, auth_token=None):
super().__init_(base_url)
self.auth_token = auth_token
def get(self, endpoint, params=None):
headers = {}
if self.auth_token:
headers['Authorization'] = f'Bearer {self.auth_token}'
return super().get(endpoint, params=params, headers=headers)
def post(self, endpoint, data=None, json=None):
headers = {}
if self.auth_token:
headers['Authorization'] = f'Bearer {self.auth_token}'
return super().post(endpoint, data=data, json=json, headers=headers)
def put(self, endpoint, data=None, json=None):
headers = {}
if self.auth_token:
headers['Authorization'] = f'Bearer {self.auth_token}'
return super().put(endpoint, data=data, json=json, headers=headers)
def delete(self, endpoint):
headers = {}
if self.auth_token:
headers['Authorization'] = f'Bearer {self.auth_token}'
return super().delete(endpoint, headers=headers)
def add_auth_token(self, token):
self.auth_token = token
def remove_auth_token(self):
self.auth_token = None
# 使用示例
if __name__ == "__main__":
base_url = "https://api.example.com"
auth_token = "your_auth_token_here"
# 创建 RestApiRequest 实例
api = RestApiRequest(base_url, auth_token)
# 发送 GET 请求
response = api.get("users")
print(response.status_code)
print(response.json())
# 发送 POST 请求
data = {"name": "Alice", "age": 30}
response = api.post("users", json=data)
print(response.status_code)
print(response.json())Test Development Learning Exchange
Test Development Learning Exchange
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.