Skip to main content

Abstract Base Class for writing Requests based Rest Api Clients

Project description

Python 3.7 Lint and Test

Abstract Http Client

This project is a starting template for quickly implementing a python REST api client. A concrete base class encapsulating the popular requests library is provided. Abstract base class building blocks for integrating other http libraries (such as aiohttp, etc.) are also available. The main advantage to using this base class as a starting point is to save on common boilerplate actions, which are highlighted below.

Basic Features

  • Setup of session object and common general attributes
  • helper methods to send requests with session
  • Validation and debug logging of all requests sent
  • internal counter of requests sent
  • Context manager to manage session tokens (login / logout methods must be implemented)
  • Composable client and service classes

Installation

pip install abstract-http-client

Basic Usage

  • Sample implementation of api client that has no auth
from abstract_http_client.http_clients.requests_client import RequestsClient
import json

class JsonPlaceholderApiClient(RequestsClient):
  def __init__(self, host):
    super().__init__(host=host, use_https=True)

  def get_users(self):
    return self.rest_service.request_get(uri="/users").json()

  def get_posts(self):
    return self.rest_service.request_get("/posts").json()

  def add_post(self):
    return self.rest_service.request_post("/posts", data={"post": "my_post"})


if __name__ == "__main__":
  api = JsonPlaceholderApiClient(host="jsonplaceholder.typicode.com")
  users = api.get_users()
  print(json.dumps(users[:2], indent=4))
  print(f"total requests sent {api.rest_service.request_counter}")

Auth Client Sample

  • Example that requires login and authorization header on every request
  • Implement a login method - here it stores header on session object
  • Base Class context managers call Logout on exit by default
  • Login not in enter by default, can be added if prefer to have context manager trigger login. Or just put into init
from abstract_http_client.http_clients.requests_client import RequestsClient


class SampleAuthClient(RequestsClient):
  def __init__(self, host, user, password):
    super().__init__(host=host, user=user, password=password)
    self.login()

  def login(self):
    """  sample login - getting token and storing on requests session object """
    data = {"user": self.user, "password": self.password}
    self.token = self.rest_service.request_put(uri="/login", json=data)
    self.rest_service.session.headers.update({"Authorization": self.token})

  def logout(self):
    """  sample logout - invalidating token and clearing session auth header """
    self.rest_service.request_delete(uri=f"/logout/{self.token}")
    self.rest_service.session.headers.pop({"Authorization": self.token})

  def get_stuff(self) -> dict:
    """ NOTE: this is pseudocode, not real endpoint """
    return self.rest_service.request_get("/stuff").json()


if __name__ == "__main__":
  # Context manager will handle api logout
  with SampleAuthClient(host="192.168.1.3", user="admin", password="admin") as api:
    
    # call your api here 
    stuff = api.get_stuff()
    # Do more stuff

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

abstract-http-client-1.0.3.tar.gz (6.3 kB view hashes)

Uploaded Source

Built Distribution

abstract_http_client-1.0.3-py3-none-any.whl (8.8 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page