Skip to main content

Service Client Framework powered by Python asyncio.

Project description

travis-master coverall-master Documentation Status Downloads Latest Version Supported Python versions Development Status License Download format Supported Python implementations

Service Client Framework

Service Client Framework powered by Python asyncio.

The easiest way to implement a client to work with a service REST API.

Features

  • Easy way to make request to service.

  • AsyncIO implementation using aiohttp.

  • Powerful plugin system.

  • Useful plugins.

  • Mock plugin in order to make tests.

  • Opensource license: GNU LGPLv3

Installation

$ pip install aio-service-client

Getting started

Service client framework is used to call HTTP service API’s. So, you must define how to communicate with this service API defining its endpoint:

spec = {"get_users": {"path": "/user",
                      "method": "get"},
        "get_user_detail": {"path": "/user/{user_id}",
                            "method": "get"},
        "create_user": {"path": "/user",
                        "method": "post"},
        "update_user": {"path": "/user/{user_id}",
                        "method": "put"}}

Imagine you are using a Rest JSON API in order to manage users. So, you data must be sent as a JSON and response must be a JSON string. It mean you must serialize every request payload to a JSON, and parse every response as JSON. So, you only need to define JSON parser and serializer for your service:

service = ServiceClient(spec=spec,
                        plugins=[PathToken()],
                        base_path="http://example.com",
                        parser=json_decoder,
                        serializer=json_encoder)

So, you are ready to make request to service API:

resp = yield from service.call("get_users")
# it could be called directly
# resp = yield from service.get_users()

# if response is like:
# {"users": {"item": [{"userId": "12", "username": "foo"}, {"userId": "13", "username": "bar"}], "count": 2}
print("Count: %d" % resp.data['users']['count'])
for user in resp.data['users']['items']:
    print("User `%s`: %s" % (user['userId'], user['username']))

In order to send a payload you must use payload keyword on call:

resp = yield from service.call("create_user", payload={"username": "foobar"})
# it could be called directly
# resp = yield from service.create_user(payload={"username": "foobar"})

# it will make a request like:
# POST http://example.com/user
#
# {"username": "foobar"}

Plugins

PathTokens

It allows to fill placeholders on path in order to build uri.

service = ServiceClient(spec={"endpoint1": {"method": "get",
                                            "path": "/endpoint/{placeholder1}/{placeholder2}"}},
                        plugins=[PathToken()],
                        base_path="http://example.com")

resp = yield from service.call("endpoint1", placeholder1=21, placeholder1="foo")
# It will make request:
# GET http://example.com/endpoint/21/foo

Headers

It allows to define default headers, endpoint headers and request headers.

service = ServiceClient(spec={"endpoint1": {"method": "get",
                                            "path": "/endpoint/{placeholder1}/{placeholder2}",
                                            "headers": {"X-fake-header": "header; data"}}},
                        plugins=[Headers(headers={"content-type": "application/json"})],
                        base_path="http://example.com")

resp = yield from service.call("endpoint1", headers={"X-other-fake-header": "foo"})
# It will make request:
# GET http://example.com/endpoint/21/foo
# X-fake-header: header; data
# content-type: application/json
# X-other-fake-header: foo

Timeout

It allows to define default timeout for service request, endpoint or request.

Elapsed

It adds elapsed time to response.

QueryParams

It allows to use query parameters on request. They could be defined at service client, endpoint or request.

InnerLogger

It allows to log request after serialize and response before parse.

OuterLogger

It allows to log request before serialize and response after parse.

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

aio-service-client-0.2.0.tar.gz (8.6 kB view hashes)

Uploaded Source

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