- Routes
- Serialization
- Asynchrony
- Request Params
- Smart substitution
You can install the latest version with the command:
pip install whaox-wapi
You can create paths as you like, splitting your api-client into modules
@Route("https://example.com")
class WApi:
service = Service()
@Route("/wapi")
class Service:
@Route("/path")
@GET("/")
def get(self): pass
@POST("/path")
def post(self): pass
wapi = WApi()
wapi.service.get()
# eq
requests.get("https://example.com/wapi/path")
The library deserializes the received data according to the type that you specify in the
_T
parameter of the decorator.NOTE: The specified type must be json serializable - these are the base types and classes marked with the
@dataclass
annotation
@dataclass
class Person:
name: str
@Route("https://example.com")
class WApi:
@GET("/person", _T=Person)
def person(self) -> Person: pass
@GET("/people", _T=List[Person])
def people(self) -> List[Person]: pass
api = WApi()
person = api.person()
print(person.name)
>>> "John"
You can make the query asynchronous simply by adding an
async
keyword.
@Route("https://example.com")
class WApi:
@GET("/person")
async def person(self): pass
person = await api.person(params={"id": 1})
You can flexibly add parameters to request passing relevant attributes.
@dataclass
class GetPersonRequest:
id: int
@dataclass
class CreatePersonRequest:
name: str
@Route("https://example.com")
class WApi:
@POST("/person")
def create_person(self, body: CreatePersonRequest | dict): pass
@Route("/person")
@GET("/")
def person(self, params: GetPersonRequest | dict): pass
api.person(params={"id": 1})
api.create_person(body={"name": "john"})
# or
api.person(params=GetPersonRequest(1))
api.create_person(body=CreatePersonRequest("john"))
The library understands what variables you used during formatting and will not substitute them into the path parameters.
@dataclass
class GetPersonRequest:
id: int
preview: bool
@Route("https://example.com")
class WApi:
@Route("/person")
@GET("/{id}")
def person(self, params: GetPersonRequest): pass
person = api.person(params=GetPersonRequest(1, true))
# eq
person = requests.get("https://example.com/person/1?preview=true")