Старое API после некоторых доработок потеряла совместимость, поэтому мы решили выпустить вторую версию.
Рекомендуем использовать эту версию для написания запросов.
Отличия от старой версии:
* Новый адрес для запросов: http://<ip>:8082/rest_api/v2/
* Вместо передачи параметров в GET, перешли на POST
* Убрали из вывода результаты промежуточных вызовов (method1, method2,..), оставили только result
* Соответственно, немного поменялся схема вывода (см. соответствующий раздел)
* Модель указывается в url напрямую, например: http://<ip>:8082/rest_api/v2/Abonents/
* Атрибут запроса fields теперь не нужно маркировать номером метода. Он будет применяться к последнему объекту (возвращенному последним методом)
* Документацию (пока что только перечень доступных полей для запроса) можно посмотреть, пройдя браузером по ссылке http://<ip>:8082/rest_api/v2/
* Теперь можно в fields запрашивать вывод объектов по ссылкам (fk, m2m), обратным ссылкам и выводить property объектов, а также выводить конкретные поля этих объектов. Глубина запроса не ограничена, разделитель - двойное подчеркивание. *Внимание\! Django не объединяет запрос по обратной ссылке в один, поэтому он может выполняться заметно дольше для большого кол-ва объектов (например, если запросить все учетные записи у всех абонентов - будет 1 запрос для абонентов и по запросу на каждого абонента для получения его учетных записей)*
h3. Схема результата:
*Формат ответа:*
{code}
{"call": "/rest_api/v2/<model_name>/", "result": [<объект>, ...]}
{code}
тип поля result будет меняться в соответствии с данными (список для перечня объектов (objects.filter), словарь для 1 объекта (objects.get), значение метода при вызове метода и.т.д).
*Формат ошибки:*
{code}
{"call": "/rest_api/v2/<model_name>/", "error": "..."}
{code}
если в результате есть не пустое поле error, то значит запрос завершился неуспешно
*Формат объекта:*
{code}
{"pk": <id>, "model": "<model>", "fields": {"<field>": <value>, ...}
{code}
Если поле является ссылкой fk (например поле tarif у модели Abonents), то объект тарифа можно получить, задав fields=\["tarif"\], а pk тарифа, задав fields=\["tarif_id"\], например:
{code}
{"pk": <id>, "model": "Abonents", "fields": {"tarif": {"pk": <id тарифа>, "model": "Tarif", "fields": {<поля тарифа>}, "tarif_id": <id тарифа>}
{code}
Также, можно вывести только определенные поля тарифа через двойное подчеркивание: fields=\["tarif__name"\]:
{code}
{"pk": <id>, "model": "Abonents", "fields": {"tarif": {"pk": <id тарифа>, "model": "Tarif", "fields": {"name": <имя тарифа>}, "tarif_id": <id тарифа>}
{code}
Еще пример. Запрос ip адресов всех учетных записей абонента fields=\["abonent_id_users__ip"\]:
{code}
{"pk": <id>, "model": "Abonents", "fields": {"abonent_id_users": [{"pk": <id учетной записи>, "model": "Users", "fields": {"ip": "<ip>"}}, ...]}}
{code}
h3. Формирование запросов:
{code}
curl -XPOST -d 'method1=objects.all&arg1={}&fields=["tarif_id","tarif","abonent_id_users__ip","attr","child_folders_count"]' http://<ip>:8082/rest_api/v2/Abonents/ -D -
curl -XPOST -d 'method1=objects.all&arg1={}&fields=["tarif_id","tarif__name","tarif__reserve_plan","abonent_id_users__ip","attr","child_folders_count"]' http://<ip>:8082/rest_api/v2/Abonents/ -D -
{code}
h3. Примеры:
Вывести абоннетов, у которых есть учетная запись с ip = 127.1.2.3:
{code}
curl -XPOST -d 'method1=objects.filter&arg1={"abonent_id_users__ip":"127.1.2.3"}' http://<ip>:8082/rest_api/v2/Abonents/ -D -
{code}
или количество таких абонентов:
{code}
curl -XPOST -d 'method1=objects.filter&arg1={"abonent_id_users__ip":"127.1.2.3"}&method2=count&arg2={}' http://<ip>:8082/rest_api/v2/Abonents/ -D -
{code}
Рекомендуем использовать эту версию для написания запросов.
Отличия от старой версии:
* Новый адрес для запросов: http://<ip>:8082/rest_api/v2/
* Вместо передачи параметров в GET, перешли на POST
* Убрали из вывода результаты промежуточных вызовов (method1, method2,..), оставили только result
* Соответственно, немного поменялся схема вывода (см. соответствующий раздел)
* Модель указывается в url напрямую, например: http://<ip>:8082/rest_api/v2/Abonents/
* Атрибут запроса fields теперь не нужно маркировать номером метода. Он будет применяться к последнему объекту (возвращенному последним методом)
* Документацию (пока что только перечень доступных полей для запроса) можно посмотреть, пройдя браузером по ссылке http://<ip>:8082/rest_api/v2/
* Теперь можно в fields запрашивать вывод объектов по ссылкам (fk, m2m), обратным ссылкам и выводить property объектов, а также выводить конкретные поля этих объектов. Глубина запроса не ограничена, разделитель - двойное подчеркивание. *Внимание\! Django не объединяет запрос по обратной ссылке в один, поэтому он может выполняться заметно дольше для большого кол-ва объектов (например, если запросить все учетные записи у всех абонентов - будет 1 запрос для абонентов и по запросу на каждого абонента для получения его учетных записей)*
h3. Схема результата:
*Формат ответа:*
{code}
{"call": "/rest_api/v2/<model_name>/", "result": [<объект>, ...]}
{code}
тип поля result будет меняться в соответствии с данными (список для перечня объектов (objects.filter), словарь для 1 объекта (objects.get), значение метода при вызове метода и.т.д).
*Формат ошибки:*
{code}
{"call": "/rest_api/v2/<model_name>/", "error": "..."}
{code}
если в результате есть не пустое поле error, то значит запрос завершился неуспешно
*Формат объекта:*
{code}
{"pk": <id>, "model": "<model>", "fields": {"<field>": <value>, ...}
{code}
Если поле является ссылкой fk (например поле tarif у модели Abonents), то объект тарифа можно получить, задав fields=\["tarif"\], а pk тарифа, задав fields=\["tarif_id"\], например:
{code}
{"pk": <id>, "model": "Abonents", "fields": {"tarif": {"pk": <id тарифа>, "model": "Tarif", "fields": {<поля тарифа>}, "tarif_id": <id тарифа>}
{code}
Также, можно вывести только определенные поля тарифа через двойное подчеркивание: fields=\["tarif__name"\]:
{code}
{"pk": <id>, "model": "Abonents", "fields": {"tarif": {"pk": <id тарифа>, "model": "Tarif", "fields": {"name": <имя тарифа>}, "tarif_id": <id тарифа>}
{code}
Еще пример. Запрос ip адресов всех учетных записей абонента fields=\["abonent_id_users__ip"\]:
{code}
{"pk": <id>, "model": "Abonents", "fields": {"abonent_id_users": [{"pk": <id учетной записи>, "model": "Users", "fields": {"ip": "<ip>"}}, ...]}}
{code}
h3. Формирование запросов:
{code}
curl -XPOST -d 'method1=objects.all&arg1={}&fields=["tarif_id","tarif","abonent_id_users__ip","attr","child_folders_count"]' http://<ip>:8082/rest_api/v2/Abonents/ -D -
curl -XPOST -d 'method1=objects.all&arg1={}&fields=["tarif_id","tarif__name","tarif__reserve_plan","abonent_id_users__ip","attr","child_folders_count"]' http://<ip>:8082/rest_api/v2/Abonents/ -D -
{code}
h3. Примеры:
Вывести абоннетов, у которых есть учетная запись с ip = 127.1.2.3:
{code}
curl -XPOST -d 'method1=objects.filter&arg1={"abonent_id_users__ip":"127.1.2.3"}' http://<ip>:8082/rest_api/v2/Abonents/ -D -
{code}
или количество таких абонентов:
{code}
curl -XPOST -d 'method1=objects.filter&arg1={"abonent_id_users__ip":"127.1.2.3"}&method2=count&arg2={}' http://<ip>:8082/rest_api/v2/Abonents/ -D -
{code}