Общие принципы

API принемает GET и POST HTTP запросы. В случае успешного запроса сервер отвечает статусом 200.

Формат JSON ответа от сервера:

{
	"data": {},
	"errors": [],
	"status": "ok"
}
  • data - [] или {}
  • errors - список ошибок
  • status - ok или bad

При авторизации система выдает sid, все последующие запросы выполняются передачей этого идентификатора. Cрок жизни идентификатора 15 минут. Обновлять его требуется только при получении ошибки WrongSIDException в поле errors.

Следующие сценарии будут расценены сервером как избыточные и могут отбрасываться:

  • Авторизация и получение SID перед каждым запросом;
  • Обращение к серверу со скоростью чаще, чем 10 вызовов в минуту;

Для обеспечения равномерной нагрузки на сетевое и серверное оборудование, компания SAURES оставляет за собой право ограничивать количество запросов в единицу времени, а также может создавать БАН листы IP адресов нарушителей. Необходимо использовать принцип необходимого и достаточного объема обмена данными с сервером!

Пример получения списка объектов

Python3.7/aiohttp

import asyncio
from aiohttp import ClientSession, ClientOSError

API_URL = 'https://api.saures.ru/1.0'
EMAIL = 'demo@saures.ru'
PASSWORD = 'demo'

def api_limits(func):
    async def wrapped(*args, **kwargs):
        n = 3 # кол-во попыток
        for i in range(n):
            try:
                return await func(*args, **kwargs)
            except ClientOSError:
                await asyncio.sleep(10)
        raise ValueError('Максимальное количество попыток')
    return wrapped

@api_limits
async def get_sid(email, password):

    params = {
        'email': email,
        'password': password
    }

    async with ClientSession() as session:
        async with session.request('POST', API_URL + '/login',
                data=params) as request:
            response = await request.json()

    if response['status']=='ok':
        return response['data']['sid']
    elif 'WrongCredsException' in [e['name'] for e in response['errors']]:
        raise ValueError('Неправильный email или пароль')

@api_limits
async def user_objects(sid):
    n = 3 # кол-во попыток
    for i in range(n):

        async with ClientSession() as session:
            async with session.request('GET', API_URL + '/user/objects',
                    params={'sid': sid}) as request:
                response = await request.json()

        if response['status']=='ok':
            print(response['data'])
            return response['data']
        elif 'WrongSIDException' in [e['name'] for e in response['errors']]:
            if i < n - 1: sid = await get_sid()

async def main():
    sid = await get_sid(email=EMAIL, password=PASSWORD)
    objects = await user_objects(sid=sid)
    print(objects)

asyncio.run(main())
© 2020 SAURES - система автоматизированного учета и контроля ресурсов