18. Приложение 10. Методические рекомендации по инструменту доступа к открытым данным (API)

18. Приложение 10. Методические рекомендации по инструменту доступа к открытым данным (API)

Случаи использования API

API для доступа к открытым данным следует использовать для предоставления доступа к информации, имеющей одно или несколько свойств из следующего списка:

- большие объемы информации;

- часто меняющаяся информация;

- осуществление специфической выборки данных набора.

API позволяет выбирать из большого объема информации только нужные потребителю данные, тем самым обеспечивая актуальность часто обновляемых данных.

Методы API

В текущей версии Методических рекомендаций рекомендуется реализовывать только методы для просмотра и чтения данных. Добавление, обновление/изменение и удаление данных данной версией Методических рекомендаций не предусмотрено, все вызовы API реализуются HTTP-методом GET.

Адрес доступа к API

Располагайте API интерфейс на отдельном домене - api.example.com, opendataapi.example.com; или в отдельном разделе - example.com/api, example.com/opendataapi.

Адреса вызовов API

Рекомендуется использовать понятные адреса для доступа к информации:

- /showrooms - все выставочные залы Москвы;

- /showrooms/2345 - информация о конкретном выставочном зале.

В базовых адресах рекомендуется использовать существительные во множественном числе без использования глаголов. Конкретные имена лучше абстрактных, так, например: showrooms лучше, чем items.

Рекомендуется базовые адреса делать короткими и простыми, без множества параметров. Все дополнительные параметры рекомендуется указывать в параметрах запроса после знака "?".

Формат ответа API

Так как целевыми потребителями API будут в основном разработчики мобильных приложений и приложений для официальных сайтов, рекомендуемым форматом ответа является JSON. Альтернативным форматом ответа может быть XML.

Если ваш API реализует несколько форматов ответа, то необходимо предусмотреть указание формата в вызове. Лучше всего указывать его в адресе вызова:

/showrooms.json/2345

/showrooms.xml/2345

Также можно передавать формат ответа параметром в запросе:

/showrooms/2345?type=json

/showrooms/2345?type=xml

В случае если формат ответа не был задан в явном виде, API должен поддерживать ответ в формате по умолчанию.

Версионность API

Обязательно предусмотрите возможность выставления версии API при выполнении запроса.

Как реализовывать версионность API?

Номер версии рекомендуется указывать целым числом, без точек; перед номером версии рекомендуется добавлять символ "v".

Рекомендуемым подходом является явное указание версии API в адресе API запроса - api.example.com/v1/showrooms/2345

Также можно передавать номер версии параметром в запросе - api.example.com/showrooms/2345?version=v1

Постраничный ответ

API должен предусматривать постраничный ответ. По умолчанию достаточно отдавать 10 элементов с нулевым смещением.

Постраничность рекомендуется реализовывать в виде двух параметров запроса - число элементов (limit) и смещение (offset):

/showrooms?offset=50&limit=10

В ответе рекомендуется сообщать обратно клиенту параметры запроса и общее число элементов, доступных для запроса.

    {
      "status": "200",
      "request": {"limit": "10", "offset": "50"},
      "meta":{"total": "2035"},
      "results": {...}
    }

Частичный ответ

Частичный ответ подразумевает отправку в ответе только запрошенных атрибутов элементов данных. Нужные атрибуты перечисляются через запятую в параметрах запроса.

/showrooms?fields=name,address

Наименование атрибутов

Атрибуты рекомендуется именовать следуя конвенции camelCase. Но можно выбрать и другую конвенцию, главное следовать ей для наименования всех атрибутов.

Поиск

Ваш API может предлагать интерфейс поиска по данным.

/search?q=search+phrase

/search.xml?q=search+phrase

/showrooms?q=search+phrase

Примеры API запросов и ответов

Запрос:

GET http://api.example.com/v1/showrooms?type=json&limit=3

Ответ:

    {
      "status": "200",
      "request": {"api": "v1", "type": "json", "limit": "3"},
      "meta": {"total": "2034"},
      "results": {
        {"name":   "ГБУК  г. Москвы   "Выставочный   зал   "Солянка   ВПА",
"district":   "Центральный   административный   округ",  "area": "Басманный
район",  "address":  "улица  Солянка,  дом 1/2,  строение 2",  "telephone":
"(495) 621-55-72; (495) 621-59-61"},
        {"name": "ГБУК г. Москвы "Выставочный зал "Творчество", "district":
"Центральный административный округ", "area": "Таганский район", "address":
"Таганская улица, дом 31/22", "telephone": "(495) 678-55-78"},
        {"name": "ГБУК г. Москвы "Московский выставочный зал  "Галерея A3",
"district":  "Центральный  административный  округ", "area": "район Арбат",
"address":    "Староконюшенный    переулок,    дом    39",     "telephone":
"(495) 697-14-56"}
      }
    }

Запрос:

GET http://api.example.com/v2/showrooms/3

Ответ:

    {
      "status": "200",
      "request": {"api": "v2", "id": "3"},
      "meta": {},
      "results": {
        {"name": "ГБУК г. Москвы "Московский выставочный зал  "Галерея A3",
"district": "Центральный  административный  округ",  "area": "район Арбат",
"address":    "Староконюшенный    переулок,    дом    39",     "telephone":
"(495) 697-14-56"}
      }
    }

Запрос:

GET

http://api.example.com/v1/showrooms?limit=2&offset=1&fields=name,area,address

Ответ:

    {
      "status": "200",
      "request":  {"api":  "v1",  "limit":  "2",  "offset":  "1", "fields":
"name,area,address"},
      "meta": {"total": "2034"},
      "results": {
        {"name": "ГБУК г. Москвы  "Выставочный  зал  "Творчество",  "area":
"Таганский район", "address": "Таганская улица, дом 31/22"},
        {"name":  "ГБУК г. Москвы "Московский выставочный зал "Галерея A3",
"area": "район Арбат", "address": "Староконюшенный переулок, дом 39"}
      }
    }