================
Запросы и ответы
================
Аутентификация
==============
При разработке Django-приложений для браузера, вы можете не думать об
этом. Аутентификация будет происходить по ключу сессии так, как это
обычно работает в `Django`__.
__ https://docs.djangoproject.com/en/dev/topics/http/sessions/
Авторизованный доступ к выполнению методов из сторонних приложений и
скриптов осуществляется по следующим правилам:
1. Принимается Basic-авторизация в заголовке ``Authorization`` внутри ``POST`` или ``GET`` запросов.
2. Принимается обычная авторизация **только** внутри ``POST`` запросов.
3. После первого успешного ответа сервера, учётные данные не требуются если клиент поддерживает ``cookies``.
Обычная авторизация - это передача в открытом виде параметров ``username``
и ``password`` непосредственно в ``POST`` запросе или внутри ``jsonData``.
Структура запросов
==================
Любой запрос должен содержать обязательный ключ ``method`` и необязательный ``language``.
В POST-запросе дополнительно могут находится ключи: ``username``, ``password``.
Прочие ключи воспринимаются как параметры метода.
При использовании сложно-структурированных параметров, все ключи, за
исключением ``language``, должны быть упакованы в один ``jsonData`` (JSON
закодированный как `URL Encoding`__). Это возможно только с ``POST`` запросами.
__ http://www.w3schools.com/tags/ref_urlencode.asp
Для передачи зарезервированных имён ``username``, ``password`` и ``language`` в
роли параметров для метода, вы должны обернуть все параметры в ключ
``kwargs`` внутри ``jsonData``.
.. code-block:: shell
### GET ###
curl "http://localhost:8000/reports/api/?method=quickapi.test"
curl "http://localhost:8000/reports/api/?method=quickapi.test&code=302&redirect=/login/"
curl "http://localhost:8000/reports/api/?method=quickapi.test&language=ru"
### POST ###
curl "http://localhost:8000/reports/api/" -d "method=quickapi.test&language=en"
curl "http://localhost:8000/reports/api/" -d "method=quickapi.test&username=test&password=test"
### POST + JSON ###
curl "http://localhost:8000/reports/api/" -d "jsonData=%7B%22method%22%3A%22quickapi.test%22%2C%22kwargs%22%3A%7B%22code%22%3A301%7D%7D"
curl "http://localhost:8000/reports/api/" -d "jsonData=%7B%22method%22%3A%22quickapi.test%22%2C%22kwargs%22%3A%7B%22code%22%3A301%7D%7D&language=en"
Использование готовых клиентов
------------------------------
jQuery
******
.. code-block:: html
Более подробный пример находится :ref:`тут `.
Python
******
.. code-block:: python
from quickapi.client import BaseClient
kw = {
'url': 'http://localhost:8000/reports/api/',
# Можно установить все необходимые параметры:
# `username`, `password`, `timeout`, `cookie_filename`...
}
# Один экземпляр для всех вызываемых методов
api = BaseClient(**kw)
# Включить печать заголовков ответа
api.print_info = True
# Не авторизованный пользователь
data = api.method('quickapi.test')
# Установка файла с cookies
api.set_cookiejar('cookies.txt')
api.username = 'login'
api.password = 'passw'
# Вы можете включить HTTP Basic авторизацию
api.use_basic_auth = True
# Попытка авторизации пользователя
data = api.method('quickapi.test')
# В дальнейшем авторизация будет происходить с помощью файлов cookie и данные лучше скрыть
api.username = None
api.password = None
data = api.method('quickapi.test', code=200)
# Тестовый вызов ошибок
data = api.method('quickapi.test', code=302)
data = api.method('quickapi.test', code=400)
data = api.method('quickapi.test', code=401)
data = api.method('quickapi.test', code=500)
data = api.method('quickapi.test', bugparam=1)
data = api.method('bug.method.name', code=200)
Структура ответов
=================
Тип и структура вложенного объекта зависят от вызываемого метода. Но
общая схема выглядит единообразно.
Стандартный ответ с данными (JSONResponse):
.. code-block:: javascript
{
"status": 200,
"message": "OK",
"data": null,
}
Переадресация (JSONRedirect):
.. code-block:: javascript
{
"status": 301,
"message": "Moved Permanently",
"data": {"Location": "/to-redirect/"},
}
Как вы могли заметить, всегда присутствуют ключи:
* **status** - код ответа - тут могут быть ваши собственные коды, либо стандартные коды протокола HTTP;
* **message** - небольшое сообщение, характризующее исполнение метода;
* **data** - любые данные, которые вы хотите передать клиенту;