Использование API

Введение

Этот документ предназначен для разработчиков, которые хотят писать клиентские библиотеки, подключаемые модули IDE и другие инструменты для взаимодействия с API Google. Служба обнаружения API Google позволяет делать все вышеперечисленное, предоставляя машиночитаемые метаданные о других API Google через простой API. В этом руководстве представлен обзор каждого раздела документа Discovery, а также полезные советы по использованию документа.

Все вызовы API являются неаутентифицированными запросами REST на основе JSON, которые используют SSL, т. е. URL-адреса начинаются с https .

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

Формат документа обнаружения

В этом разделе дается обзор документа Discovery.

Во всех приведенных ниже примерах используется документ Discovery из Google Cloud Service Management API . Вы можете загрузить документ обнаружения для Google Cloud Service Management API, выполнив этот GET :

GET https://servicemanagement.googleapis.com/$discovery/rest?version=v1

Формат документа Discovery включает информацию, которая делится на шесть основных категорий:

Каждый из этих разделов документа Discovery описан ниже. Обратитесь к справочной документации для получения более подробной информации о каждом свойстве.

Базовое описание API

Документ Discovery содержит набор специфичных для API свойств:

"kind": "discovery#restDescription",
"name": "servicemanagement",
"version": "v1",
"title": "Service Management API",
"description": "Google Service Management allows service producers to publish their services on Google Cloud Platform so that they can be discovered and used by service consumers.",
"protocol": "rest",
"rootUrl": "https://servicemanagement.googleapis.com/. Root URL under which all API services live",
"servicePath": "",

Эти свойства уровня API включают сведения о конкретной версии API, включая name , version , title и description . protocol всегда имеет фиксированное значение rest , так как служба обнаружения API поддерживает только методы RESTful для доступа к API.

Поле servicePath указывает префикс пути для этой конкретной версии API.

Аутентификация

Раздел auth содержит сведения об областях аутентификации OAuth 2.0 для API. Чтобы узнать больше о том, как использовать области с OAuth 2.0, посетите страницу Использование OAuth 2.0 для доступа к API Google .

Раздел auth содержит вложенный oauth2 и scopes . Раздел scopes представляет собой сопоставление ключа/значения от значения области к более подробной информации о области:

"auth": {
  "oauth2": {
    "scopes": {
      "https://www.googleapis.com/auth/cloud-platform.read-only": {
        "description": "View your data across Google Cloud Platform services"
      },
      "https://www.googleapis.com/auth/service.management.readonly": {
        "description": "View your Google API service configuration"
      },
      "https://www.googleapis.com/auth/cloud-platform": {
        "description": "View and manage your data across Google Cloud Platform services"
      },
      "https://www.googleapis.com/auth/service.management": {
        "description": "Manage your Google API service configuration"
      }
    }
  }
}

Раздел auth определяет только области действия для конкретного API. Чтобы узнать, как эти области связаны с методом API, обратитесь к разделу « Методы » ниже.

Ресурсы и схемы

Операции API воздействуют на объекты данных, называемые resources . Документ Discovery построен вокруг концепции ресурсов. В каждом документе Discovery есть раздел resources верхнего уровня, в котором сгруппированы все ресурсы, связанные с API. Например, API управления облачными службами Google имеет ресурс services и ресурс operations в разделе ресурсов верхнего уровня, resources services имеет три configs : конфигурации, rollouts и consumers :

"resources": {
  "services": {
    // Methods and sub-resources associated with the services resource
    "configs": {
      // Methods and sub-resources associated with the services.configs resource
    },
    "rollouts": {
      // Methods and sub-resources associated with the services.rollouts resource
    },
    "consumers": {
      // Methods and sub-resources associated with the services.consumers resource
    }
  },
  "operations": {
    // Methods and sub-resources associated with the operations resource
  }
}

Внутри каждого раздела ресурсов находятся методы, связанные с этим ресурсом. Например, Google Cloud Service Management API имеет три метода, связанных с ресурсом services.rollouts : get , list и create .

Схемы сообщают вам, как выглядят ресурсы в API. Каждый документ обнаружения имеет раздел schemas верхнего уровня, который содержит пару имя/значение идентификатора схемы для объекта. Идентификаторы схемы уникальны для каждого API и используются для уникальной идентификации схемы в разделе methods документа Discovery:

"schemas": {
  "Rollout": {
    // JSON Schema of the Rollout resource.
  }
}

Служба обнаружения API использует черновик схемы JSON-03 для своих представлений схемы. Вот фрагмент схемы JSON для ресурса URL вместе с фактическим ресурсом ответа:

Схема развертывания ресурса JSON: Фактический ответ ресурса развертывания:
{
  "Rollout": {
    "id": "Rollout",
    "type": "object",
    "description": "...",
    "properties": {
      "serviceName": {
        "type": "string",
        "description": "..."
      },
      "rolloutId": {
        "type": "string",
        "description": "..."
      },
      "status": {
        "type": "string",
        "enum": [
          "ROLLOUT_STATUS_UNSPECIFIED",
          "IN_PROGRESS",
          "SUCCESS",
          "CANCELLED",
          "FAILED",
          "PENDING",
          "FAILED_ROLLED_BACK"
        ],
        "enumDescriptions": [
          ...
        ],
        "description": "..."
      },
      "trafficPercentStrategy": {
        "$ref": "TrafficPercentStrategy",
        "description": "..."
      },
      "deleteServiceStrategy": { ... },
      "createTime": { ... },
      "createdBy": { ... }
    }
  }
}

{
  "serviceName": "discovery.googleapis.com",
  "rolloutId": "2020-01-01R0",
  "status": "SUCCESS",
  "trafficPercentStrategy":{
    "precentages":{
      "2019-12-01R0": 70.00,
      "2019-11-01R0": 30.00
    }
  }
}

Поля, выделенные жирным шрифтом, показывают сопоставление между схемой JSON и фактическим ответом.

Схемы также могут содержать ссылки на другие схемы. Если вы создаете клиентскую библиотеку, это может помочь вам эффективно моделировать объекты API в ваших классах модели данных. В приведенном выше примере trafficPercentStrategy Rollout самом деле является ссылкой на схему с идентификатором TrafficPercentStrategy . Если вы посмотрите на раздел schemas , вы найдете схему TrafficPercentStrategy . Значением этой схемы можно заменить свойство trafficPercentStrategy в ресурсе Rollout (обратите внимание, что синтаксис $ref взят из спецификации схемы JSON ).

Методы также могут ссылаться на схемы при указании тела запроса и ответа. Обратитесь к разделу « Методы » для более подробной информации.

Методы

Ядро документа Discovery построено вокруг методов. Методы — это операции, которые можно выполнять в API. Вы найдете раздел methods в различных областях документа Discovery, в том числе на верхнем уровне (который мы называем методами уровня API) или на уровне resources .

"methods": {
  // API-level methods
}
"resources": {
  "resource1": {
    "methods": {
      // resource-level methods
    }
    "resources": {
      "nestedResource": {
        "methods": {
          // methods can even be found in nested-resources
        }
      }
    }
  }
}

Хотя API может иметь методы уровня API, ресурс должен иметь раздел methods .

Каждый раздел methods представляет собой сопоставление ключей и значений от имени метода до других сведений об этом методе. В приведенном ниже примере описаны три метода: get , list и create :

"methods": {
  "get": { //details about the "get" method },
  "list": { //details about the "list" method },
  "create": { //details about the "create" method }
}

Наконец, в разделе каждого метода подробно описаны различные свойства этого метода. Вот пример метода get :

"get": {
  "id": "servicemanagement.services.rollouts.get",
  "path": "v1/services/{serviceName}/rollouts/{rolloutId}",
  "flatPath": "v1/services/{serviceName}/rollouts/{rolloutId}",
  "httpMethod": "GET",
  "description": "Gets a service configuration rollout.",
  "response": { "$ref": "Rollout" },
  "parameters": { // parameters related to the method },
  "parameterOrder": [ // parameter order related to the method ],
  "scopes": [ // OAuth 2.0 scopes applicable to this method ],
  "mediaUpload": { // optional media upload information },
},

Этот раздел содержит общие сведения о методе, такие как уникальный ID для идентификации метода, используемый httpMethod и path к методу (подробные сведения о том, как использовать свойство path для вычисления полного URL-адреса метода, см. в разделе Составление запроса ). ). В дополнение к этим общим свойствам метода есть несколько свойств, которые связывают метод с другими разделами документа Discovery:

Сферы

Раздел auth , определенный ранее в этой документации, содержит информацию обо всех областях, поддерживаемых конкретным API. Если метод поддерживает одну из этих областей, он будет иметь массив областей. В этом массиве есть одна запись для каждой области, поддерживаемой методом. Например, раздел scopes действия метода get Google Cloud Service Management API выглядит следующим образом:

"scopes": [
  "https://www.googleapis.com/auth/cloud-platform",
  "https://www.googleapis.com/auth/cloud-platform.read-only",
  "https://www.googleapis.com/auth/service.management",
  "https://www.googleapis.com/auth/service.management.readonly"
]

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

Запрос и ответ

Если у метода есть тело запроса или ответа, они задокументированы в разделах request или response соответственно. В приведенном get примере метод имеет тело response :

"response": {
  "$ref": "Rollout"
}

Приведенный выше синтаксис указывает, что тело ответа определяется схемой JSON с идентификатором Rollout . Эту схему можно найти в разделе схем верхнего уровня. И запрос, и тело ответа используют синтаксис $ref для ссылки на схемы.

Параметры

Если у метода есть параметры, которые должны быть указаны пользователем, эти параметры задокументированы в разделе parameters уровня метода. Этот раздел содержит сопоставление ключа/значения имени параметра с более подробной информацией об этом параметре:

"parameters": {
  "serviceName": {
    "type": "string",
    "description": "Required. The name of the service.",
    "required": true,
    "location": "path"
  },
  "rolloutId": { ... }
},
"parameterOrder": [
  "serviceName",
  "rolloutId"
]

В приведенном выше примере у метода get есть два параметра: serviceName и rolloutId . Параметры могут быть либо в path , либо в URL- query ; свойство location указывает, куда клиентская библиотека должна поместить параметр.

Есть много других свойств, описывающих параметр, включая type данных параметра (полезно для строго типизированных языков), является ли параметр required и является ли параметр перечислением. Обратитесь к Справочному руководству для получения более подробной информации о свойствах.

Порядок параметров

Для клиентских библиотек существует множество способов структурировать свои интерфейсы. Один из способов — иметь метод с каждым параметром API в сигнатуре метода. Однако, поскольку JSON является неупорядоченным форматом, программно сложно понять, как упорядочить параметры в сигнатуре метода. Массив parameterOrder обеспечивает фиксированный порядок параметров для выполнения запросов. В массиве перечислены имена каждого параметра в порядке значимости; он может содержать параметры пути или запроса, но каждый параметр в массиве является обязательным. В приведенном выше примере сигнатура метода Java может выглядеть примерно так:

public Rollout get(String serviceName, String rolloutId, Map<String, Object> optionalParameters);

Первое значение в массиве parameterOrder , serviceName , также является первым элементом в сигнатуре метода. Если бы в массиве parameterOrder были другие параметры, они шли бы после параметра serviceName . Поскольку массив parameterOrder содержит только обязательные параметры, рекомендуется включить для пользователей способ указания необязательных параметров. В приведенном выше примере это делается с помощью карты optionalParameters .

Загрузка медиа

Если метод поддерживает загрузку мультимедиа, например изображений, аудио или видео, то местоположение и протоколы, поддерживаемые для загрузки этого мультимедиа, задокументированы в разделе mediaUpload . В этом разделе содержится информация о том, какие протоколы загрузки поддерживаются, а также информация о том, какие типы мультимедиа можно загружать:

"supportsMediaUpload": true,
"mediaUpload": {
  "accept": [
    "image/*"
  ],
  "maxSize": "10MB",
  "protocols": {
    "simple": {
      "multipart": true,
      "path": "/upload/storage/v1beta1/b/{bucket}/o"
    },
    "resumable": {
     "multipart": true,
     "path": "/resumable/upload/storage/v1beta1/b/{bucket}/o"
    }
  }
}

В приведенном выше примере свойство supportsMediaUpload является логическим значением, которое определяет, поддерживает ли метод загрузку мультимедиа. Если значение равно true, раздел mediaUpload документирует типы медиафайлов, которые можно загружать.

Свойство accept представляет собой список медиа-диапазонов , которые определяют, какие MIME-типы допустимы для загрузки. Конечная точка, показанная в приведенном выше примере, будет принимать любой формат изображения.

Свойство maxSize имеет максимальный размер загрузки. Значение представляет собой строку в единицах МБ, ГБ или ТБ. В приведенном выше примере максимальный размер загрузки ограничен 10 МБ. Обратите внимание, что это значение не отражает оставшуюся квоту хранения отдельного пользователя для этого API, поэтому, даже если загрузка меньше maxSize , клиентская библиотека все равно должна быть готова обработать загрузку, которая не удалась из-за нехватки места.

В разделе protocols перечислены протоколы загрузки, поддерживаемые методом. simple протокол просто отправляет мультимедиа в заданную конечную точку в одном HTTP-запросе. Протокол resumable загрузки подразумевает, что конечная точка, указанная в URI path , поддерживает протокол возобновляемой загрузки . Если свойство multipart имеет значение true , то конечная точка принимает составные загрузки, что означает, что и запрос JSON, и медиаданные могут быть заключены вместе в составное/связанное тело и отправлены вместе. Обратите внимание, что как simple , так и resumable протоколы могут поддерживать многокомпонентную загрузку.

Свойство path является шаблоном URI и должно быть развернуто так же, как свойство path для метода, как описано в разделе Составление запроса .

Загрузка мультимедиа

Если метод поддерживает загрузку мультимедиа, например изображений, аудио или видео, это указывается параметром supportsMediaDownload :

"supportsMediaDownload": true,

При загрузке мультимедиа вы должны установить для параметра запроса alt значение media в URL-адресе запроса.

Если свойство useMediaDownloadService метода API имеет значение true , вставьте /download перед servicePath , чтобы избежать перенаправления. Например, путь загрузки — /download/youtube/v3/captions/{id} , если объединение servicePath и path/youtube/v3/captions/{id} . Рекомендуется создавать URL-адрес загрузки мультимедиа с /download , даже если useMediaDownloadService установлено значение false.

Общие параметры

Документ обнаружения верхнего уровня содержит свойство parameters . Этот раздел аналогичен разделу параметров для каждого метода , однако эти параметры можно применить к любому методу в API.

Например, методы get, insert или list API управления облачными службами Google могут иметь параметр prettyPrint в параметрах запроса, который будет форматировать ответ для всех этих методов в удобочитаемом формате. Вот список общих параметров:

Параметр Значение Заметки Применимость
access_token Токен OAuth 2.0 для текущего пользователя.
alt

Формат данных для ответа.

  • Допустимые значения: json , atom , csv .
  • Значение по умолчанию: зависит от API.
  • Не все значения доступны для каждого API.
  • Применяется ко всем операциям для всех ресурсов.
callback Функция обратного вызова.
  • Имя функции обратного вызова JavaScript, которая обрабатывает ответ.
  • Используется в запросах JavaScript JSON-P .
fields Селектор, указывающий подмножество полей для включения в ответ.
  • Дополнительные сведения см. в документации по частичному ответу .
  • Используйте для лучшей производительности.
key API-ключ. (ТРЕБУЕТСЯ*)
  • *Обязательно, если вы не предоставите токен OAuth 2.0.
  • Ваш ключ API идентифицирует ваш проект и предоставляет вам доступ к API, квоту и отчеты.
  • Получите ключ API вашего проекта в консоли API .
prettyPrint

Возвращает ответ с идентификаторами и разрывами строк.

  • Возвращает ответ в удобочитаемом формате, если true .
  • Значение по умолчанию: зависит от API.
  • Когда это значение равно false , это может уменьшить размер полезной нагрузки ответа, что может привести к повышению производительности в некоторых средах.
quotaUser Альтернатива userIp .
  • Позволяет применять квоты для каждого пользователя из серверного приложения, даже если IP-адрес пользователя неизвестен. Это может произойти, например, с приложениями, которые запускают задания cron в App Engine от имени пользователя.
  • Вы можете выбрать любую произвольную строку, которая однозначно идентифицирует пользователя, но ее длина ограничена 40 символами.
  • Переопределяет userIp , если указаны оба.
  • Узнайте больше об использовании ограничений .
userIp IP-адрес конечного пользователя, для которого выполняется вызов API.
  • Позволяет применять квоты для каждого пользователя при вызове API из серверного приложения.
  • Узнайте больше об использовании ограничений .

Функции

В некоторых случаях API поддерживают пользовательские функции, выходящие за рамки остальной части документа Discovery. Они собраны в массиве features . Массив функций содержит строковую метку для каждой специальной функции, поддерживаемой API. В настоящее время dataWrapper является единственной поддерживаемой функцией, но в будущем могут поддерживаться и другие функции.

"features": dataWrapper

Функция dataWrapper указывает, что все запросы к API и ответы от API упаковываются в объект data JSON. Это функция старых API Google, но в дальнейшем она устаревает. Следующие API поддерживают функцию dataWrapper : Moderator v1 и Translate v2 .

Как разработчик клиентской библиотеки, если API поддерживает функцию «dataWrapper», вы должны сделать следующее:

  1. По запросам: оберните ресурс запроса в объект data JSON.
  2. Об ответах: найдите ресурс внутри объекта data JSON.

Схемы в документе Discovery не содержат оболочку данных, поэтому вы должны явно добавлять и удалять их. Например, предположим, что есть API с ресурсом с именем «Foo», который выглядит так:

{
  "id": 1,
  "foo": "bar"
}

Прежде чем вставить этот ресурс с помощью API, вам нужно обернуть его в элемент данных:

{
  "data": {
    "id": 1,
    "foo": "bar"
  }
}

С другой стороны, когда вы получаете ответ от API, он также содержит оболочку данных:

{
  "data": {
    "id": 1,
    "foo": "bar"
  }
}

Чтобы получить ресурс, определенный схемой, вам нужно удалить оболочку данных:

{
  "id": 1,
  "foo": "bar"
}

Встроенная документация

Каждый документ Discovery аннотирован рядом полей description , которые предоставляют встроенную документацию для API. Поля description можно найти для следующих элементов API:

  • сам API
  • Область действия OAuth
  • Схемы ресурсов
  • Методы API
  • Параметры метода
  • Допустимые значения некоторых параметров

Эти поля особенно полезны, если вы хотите использовать службу обнаружения API Google для создания удобочитаемой документации для клиентской библиотеки, например JavaDoc.

Следующие шаги