Skip to main content

Rapidly develop your API clients using decorators and annotations

Project description

Github PyPi Python CI

Rapid Api Client

Library to rapidly develop asynchronous API clients based on Pydantic and Httpx using decorators and annotations.

This project is largely inspired by FastAPI.

Usage

Install the project

pip install rapid-api-client

Declare your API using decorators and annotations (the method does not need any code, it will be generated by the decorator)

class GithubIssuesApi(RapidApi):

    @get("/repos/{owner}/{repo}/issues", response_class=RootModel[List[Issue]])
    async def list_issues(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.root:
        print(f"Issue: {issue.title} [{issue.url}]")

Features

Http method

Any HTTP method can be used with http decorator

class MyApi(RapidApi)

    @http("/anything") # default is GET
    async def get(self): ...

    @http("/anything", method="POST")
    async def post(self): ...

    @http("/anything", method="DELETE")
    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 ef 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 Pydantic model class to automatically parse the response.

Note: When a response_class is given, the raise_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()]): ...

Download files

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

Source Distribution

rapid_api_client-0.2.0.tar.gz (5.4 kB view details)

Uploaded Source

Built Distribution

rapid_api_client-0.2.0-py3-none-any.whl (6.6 kB view details)

Uploaded Python 3

File details

Details for the file rapid_api_client-0.2.0.tar.gz.

File metadata

  • Download URL: rapid_api_client-0.2.0.tar.gz
  • Upload date:
  • Size: 5.4 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

Hashes for rapid_api_client-0.2.0.tar.gz
Algorithm Hash digest
SHA256 8f9e949a8a34f9dbdc9df1fb74898be5259b8ae2c68d132ebbffe913fd0f9b88
MD5 1e5e031951d0069ed0b1f18c89c1d4fc
BLAKE2b-256 b749af0dd0b93ae2de37ba2c16f3c7be562f8e4838f00f70e53552f72ee66a80

See more details on using hashes here.

File details

Details for the file rapid_api_client-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: rapid_api_client-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 6.6 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

Hashes for rapid_api_client-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1d26d1a0781911204aef1483a87cac8b10c57f4882be11a8b36f188b129477d4
MD5 e9f1837c5d6eff8ce72569d4fb9f7421
BLAKE2b-256 e801c0d45060ca5c9ad7cb93f4d4c3f6061c69a786fd01fcb01f4521c9df6475

See more details on using hashes here.

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