Rapidly develop your API clients using decorators and annotations
Project description
Rapid Api Client
Library to rapidly develop API clients in Python, based on Pydantic and Httpx, using almost only decorators and annotations.
✨ Main features:
- ✏️ You don't write any code, you only declare the endpoints using decorators and annotations.
- 🚚 Support Pydantic to automatically parse and validate reponses (and also for posting content).
- 🏗️ Does not reimplement the low-level http-related logic, it simply uses
httpx.AsyncClient
like you would do and you can customize it. - ⚡️ Asynchronous, because
httpx
andasyncio
are just amazingly fast.
🙏 This project is inspired by FastAPI, I always wanted a library to create an API client that is as simple as FastAPI for handling the server-side part.
Usage
Install the project
pip install rapid-api-client
Declare your API endpoints using decorators and annotations, the method does not need any code, it will be generated by the decorator, just write ...
or pass
or whatever, it won't be called anyway 🙈.
class GithubIssuesApi(RapidApi):
@get("/repos/{owner}/{repo}/issues", response_class=TypeAdapter(List[Issue]))
async def list_issues(self, owner: Annotated[str, Path()], repo: Annotated[str, Path()]): ...
@get("/repos/{owner}/{repo}/releases", response_class=TypeAdapter(List[Release]))
async def list_releases(self, owner: Annotated[str, Path()], repo: Annotated[str, Path()]): ...
Use it
api = GithubIssuesApi(client)
issues = await api.list_issues("essembeh", "rapid-api-client", state="closed")
for issue in issues:
print(f"Issue: {issue.title} [{issue.url}]")
Features
Http method
Any HTTP method can be used with http
decorator
class MyApi(RapidApi)
@http("GET", "/anything")
async def get(self): ...
@http("POST", "/anything")
async def post(self): ...
@http("DELETE", "/anything")
async def delete(self): ...
Convenient decorators are available like get
, post
, delete
, put
, patch
class MyApi(RapidApi)
@get("/anything")
async def get(self): ...
@post("/anything")
async def post(self): ...
@delete("/anything")
async def delete(self): ...
Response class
By default methods return a httpx.Response
object and the http return code is not tested (you have to call resp.raise_for_status()
if you need to ensure the response is OK).
But you can also specify a class so that the response is parsed, you can use:
httpx.Response
to get the response itself, this is the default behaviorstr
to get theresponse.text
bytes
to get theresponse.content
- Any Pydantic model class (subclass of
BaseModel
), the json will be automatically validated - Any Pydantic-xml model class (subclass of
BaseXmlModel
), the xml will be automatically validated - Any
TypeAdapter
to parse the json, see pydantic doc
Note: When
response_class
is given (and is nothttpx.Response
), theraise_for_status()
is always called to ensure the http response is OK
class User(BaseModel): ...
class MyApi(RapidApi)
# this method return a httpx.Response
@get("/user/me")
async def get_user_resp(self): ...
# this method returns a User class
@get("/user/me", response_class=User)
async def get_user(self): ...
Path parameters
Like fastapi
you can use your method arguments to build the api path to call.
class MyApi(RapidApi)
@get("/user/{user_id}")
async def get_user(self, user_id: Annotated[int, Path()]): ...
# Path parameters dans have a default value
@get("/user/{user_id}")
async def get_user(self, user_id: Annotated[int, Path()] = 1): ...
Query parameters
You can add query parameters
to your request using the Query
annotation.
class MyApi(RapidApi)
@get("/issues")
async def get_issues(self, sort: Annotated[str, Query()]): ...
# Query parameters can have a default value
@get("/issues")
async def get_issues_default(self, sort: Annotated[str, Query()] = "date"): ...
# Query parameters can have an alias to change the key in the http request
@get("/issues")
async def get_issues_alias(self, sort: Annotated[str, Query(alias="sort-by")] = "date"): ...
Header parameter
You can add headers
to your request using the Header
annotation.
class MyApi(RapidApi)
@get("/issues")
async def get_issues(self, version: Annotated[str, Header()]): ...
# Headers can have a default value
@get("/issues")
async def get_issues(self, version: Annotated[str, Header()] = "1"): ...
# Headers can have an alias to change the key in the http request
@get("/issues")
async def get_issues(self, version: Annotated[str, Header(alias="X-API-Version")] = "1"): ...
Body parameter
You can send a body with your request using the Body
annotation.
This body can be
- a raw object with
Body
- a Pydantic object with
PydanticBody
- one or more files with
FileBody
class MyApi(RapidApi)
# send a string in request content
@post("/string")
async def message(self, body: Annotated[str, Body()]): ...
# send a string in request content
@post("/model")
async def model(self, body: Annotated[MyPydanticClass, PydanticBody()]): ...
# send a multiple files
@post("/files")
async def model(self, report: Annotated[bytes, FileBody()], image: Annotated[bytes, FileBody()]): ...
Xml Support
Xml is also supported is you use Pydantic-Xml, either for responses with response_class
or for POST/PUT content with PydanticXmlBody
.
class ResponseXmlRootModel(BaseXmlModel): ...
class MyApi(RapidApi)
# parse response xml content
@get("/get", response_class=ResponseXmlRootModel)
async def get_xml(self): ...
# serialize xml model automatically
@post("/post")
async def post_xml(self, body: Annotated[ResponseXmlRootModel, PydanticXmlBody()]): ...
Examples
See example directory for some examples
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file rapid_api_client-0.3.2.tar.gz
.
File metadata
- Download URL: rapid_api_client-0.3.2.tar.gz
- Upload date:
- Size: 6.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.11.10 Linux/6.8.0-1014-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 20a7381110178f2231b005924edaae2f57c1676e266899505d02099ea3fe3021 |
|
MD5 | 3ab44c4ade56bf13a1ec756a0f385e41 |
|
BLAKE2b-256 | a7b490d475c759ec384d969d2b01f6064c9e362107def294370cf641ffe6392c |
File details
Details for the file rapid_api_client-0.3.2-py3-none-any.whl
.
File metadata
- Download URL: rapid_api_client-0.3.2-py3-none-any.whl
- Upload date:
- Size: 8.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.11.10 Linux/6.8.0-1014-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c5fa14a2317541e840416b1cbeafbf9cc9cf70e00f3a10119f463a65a743f954 |
|
MD5 | 645448827a5152a4a860d24723cc9f4e |
|
BLAKE2b-256 | 285a1cdf2ce2448ada5a6e1b42d0b03dce154a149494105b80b983281475666d |